Saindo das sessões SSH de repente, matando o Apache
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 pararoot,restarto serviço comoroot, alternar paraappe 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 paraapp, alternar de volta pararoote encerrar a sessão, o Apache está bem. - Se eu SSH como
root,restarto serviço, encerrar a sessão, SSH novamente como eapp, em seguida, encerrar a sessão novamente, ele mata o Apache. - Antes desta semana, eu fui capaz de consistentemente SSH como
app, mude pararoot,restarto serviço comoroot, e encerrar a sessão sem matar Apache. - Tentei modificar
/lib/systemd/system/apache2.service.d/apache2-systemd.confe alterar a linhaRemainAfterExit=noparaRemainAfterExit=yes, executei asystemctl daemon-reloade, finalmente, aservice 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
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.