Sair das sessões SSH matando repentinamente o Apache

Sair das sessões SSH matando repentinamente o Apache

Ok, isso é uma loucura. Estou executando o Apache 2.4 em instâncias de servidor Ubuntu 16.04. Eu uso ambientes quase idênticos para 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, consegui fazer 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 perfeitamente depois . Agora, no entanto, não posso fazer isso 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, mudar para root, restarto serviço como root, voltar para e app, em seguida, encerrar a sessão, isso matará o Apache.
  • Se eu usar SSH como rooto restartserviço e encerrar a sessão, o Apache estará bem.
  • Se eu usar SSH como rooto restartserviço, mudar para app, voltar para roote encerrar a sessão, o Apache estará 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, isso matará o Apache.
  • Antes desta semana, consegui fazer SSH consistentemente como app, mudar para rooto restartserviço como roote encerrar a sessão sem interromper o 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 solução razoável para restaurar o comportamento anterior? Caso contrário, qual seria a melhor prática para implantar alterações no código do aplicativo e conceder 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 fazer login appfoi limitar a necessidade de fazer login como rootem primeiro lugar.

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

Responder1

A causa raiz disso é uma mudança na forma como o systemd (de 219) lida com objetos IPC criados por usuários logados. Por padrão, ele removerá todos os objetos IPC restantes após o logout do usuário. 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.

Como você alterou o Apache para rodar sob um usuário que não é do sistema, sempre que você sai dessa conta de usuário, o systemd destrói todos os objetos IPC do Apache, e o Apache reclama da perda de seu mutex e morre.

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

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

informação relacionada