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 exit
para encerrar a sessão SSH, e o Apache estaria funcionando bem depois. . Agora, no entanto, não posso fazer um exit
sem 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
,restart
o serviço comoroot
, alternar paraapp
e encerrar a sessão, ele mata o Apache. - Se eu SSH como
root
,restart
o serviço, em seguida, encerrar a sessão, o Apache é bom. - Se eu fizer SSH como
root
,restart
o serviço, alternar paraapp
, alternar de volta pararoot
e encerrar a sessão, o Apache está bem. - Se eu SSH como
root
,restart
o 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
,restart
o serviço comoroot
, e encerrar a sessão sem matar Apache. - Tentei modificar
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
e alterar a linhaRemainAfterExit=no
paraRemainAfterExit=yes
, executei asystemctl daemon-reload
e, finalmente, aservice apache2 restart
sem 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 app
usuário) lê-lo sem precisar fazer login em uma sessão SSH como root
? O motivo principal para efetuar login como app
era limitar a necessidade de efetuar login como root
em 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=no
em /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-data
no Ubuntu) e usar permissões e ACLs para dar www-data
acesso aos arquivos que ele precisa para ler / gravar.