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 exit
para encerrar a sessão SSH, e o Apache estaria funcionando perfeitamente depois . Agora, no entanto, não posso fazer isso 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
, mudar pararoot
,restart
o serviço comoroot
, voltar para eapp
, em seguida, encerrar a sessão, isso matará o Apache. - Se eu usar SSH como
root
orestart
serviço e encerrar a sessão, o Apache estará bem. - Se eu usar SSH como
root
orestart
serviço, mudar paraapp
, voltar pararoot
e encerrar a sessão, o Apache estará 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, isso matará o Apache. - Antes desta semana, consegui fazer SSH consistentemente como
app
, mudar pararoot
orestart
serviço comoroot
e encerrar a sessão sem interromper o 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 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 app
usuário) lê-lo sem precisar fazer login em uma sessão SSH como root
? O motivo principal para fazer login app
foi limitar a necessidade de fazer login como root
em 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.conf
o padrão no Ubuntu é yes
) e reiniciando o systemd-logind.service
.
É melhor deixar o Apache rodando como 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 ler/gravar.