Saindo das sessões SSH de repente, matando o Apache

Aug 18 2020

Ok, isso é um doozy. Estou executando o Apache 2.4 em instâncias de servidor Ubuntu 16.04. Eu uso ambientes quase idênticos para as instâncias de produção e teste, bem como uma instância quase idêntica do VirtualBox que gerencio usando o Vagrant para desenvolvimento. Por muito tempo, fui capaz de usar SSH em qualquer uma dessas instâncias de servidor como o mesmo usuário sob o qual o Apache é executado, implantar algumas alterações no código do aplicativo e, em seguida, executar exitpara encerrar a sessão SSH, e o Apache estaria funcionando bem depois. . Agora, no entanto, não posso fazer um exitsem que o serviço Apache encontre um erro fatal:

[mpm_prefork:emerg] [pid 23466] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[core:alert] [pid 17750] AH00050: Child 23466 returned a Fatal error... Apache is exiting!

Notas:

  • O usuário do Apache é app.
  • Se eu usar SSH como app, alternar para root, restarto serviço como root, alternar para appe encerrar a sessão, ele mata o Apache.
  • Se eu SSH como root, restarto serviço, em seguida, encerrar a sessão, o Apache é bom.
  • Se eu fizer SSH como root, restarto serviço, alternar para app, alternar de volta para roote encerrar a sessão, o Apache está bem.
  • Se eu SSH como root, restarto serviço, encerrar a sessão, SSH novamente como e app, em seguida, encerrar a sessão novamente, ele mata o Apache.
  • Antes desta semana, eu fui capaz de consistentemente SSH como app, mude para root, restarto serviço como root, e encerrar a sessão sem matar Apache.
  • Tentei modificar /lib/systemd/system/apache2.service.d/apache2-systemd.confe alterar a linha RemainAfterExit=nopara RemainAfterExit=yes, executei a systemctl daemon-reloade, finalmente, a service apache2 restartsem efeito.

Existe alguma explicação para a mudança repentina de comportamento? Existe uma correção razoável para restaurar o comportamento anterior? Se não, qual seria a prática recomendada para implantar mudanças no código do aplicativo e dar permissões para o Apache (o appusuário) lê-lo sem precisar fazer login em uma sessão SSH como root? O motivo principal para efetuar login como appera limitar a necessidade de efetuar login como rootem primeiro lugar.

Estou completamente perdido aqui e não entendo como tudo pode ser quebrado de repente.

Respostas

25 MichaelHampton Aug 18 2020 at 09:43

A causa raiz disso é uma mudança em como o systemd (de 219) lida com objetos IPC criados por usuários conectados. Por padrão, ele removerá quaisquer objetos IPC deixados após o usuário efetuar logout. Isso se aplica a todos os usuários que não são do sistema (uid> = 1000). Os usuários do sistema (uid <1000) não são afetados.

Já que você alterou o Apache para rodar sob um usuário que não seja do sistema, sempre que você sair dessa conta de usuário, o systemd destrói todos os objetos IPC do Apache, e o Apache então reclama sobre a perda de seu mutex e morre.

Você pode alterar esse comportamento, definindo RemoveIPC=noem /etc/systemd/logind.conf(o padrão no Ubuntu é yes) e reiniciando systemd-logind.service.

É melhor deixar o Apache rodando como um usuário do sistema (por exemplo, www-datano Ubuntu) e usar permissões e ACLs para dar www-dataacesso aos arquivos que ele precisa para ler / gravar.