Quitter des sessions SSH tuant soudainement Apache
D'accord, c'est un doozy. J'exécute Apache 2.4 sur des instances de serveur Ubuntu 16.04. J'utilise des environnements presque identiques pour les instances de production et de test, ainsi qu'une instance VirtualBox presque identique que je gère en utilisant Vagrant pour le développement. Pendant très longtemps, j'ai pu utiliser SSH dans l'une de ces instances de serveur en tant que même utilisateur sous lequel Apache s'exécute, déployer certaines modifications du code d'application, puis exécuter exit
pour mettre fin à la session SSH, et Apache fonctionnerait très bien par la suite. . Maintenant, cependant, je ne peux pas faire un exit
sans que le service Apache rencontre une erreur fatale:
[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!
Remarques:
- L'utilisateur Apache est
app
. - Si je SSH en tant que
app
, je passe àroot
,restart
le service en tant queroot
, je reviens àapp
, puis je mets fin à la session, cela tue Apache. - Si je SSH
root
,restart
le service, puis mettre fin à la session, Apache est très bien. - Si je SSH en tant que service, je passe à
root
, je reviens à , puis je mets fin à la session, Apache va bien.restart
app
root
- Si je SSH
root
,restart
le service, mettre fin à la session, SSH à nouveau commeapp
, puis mettre fin à la session à nouveau, il tue Apache. - Avant cette semaine, je suis en mesure de toujours SSH
app
, passezroot
,restart
le service queroot
, et mettre fin à la session sans tuer Apache. - J'ai essayé de modifier
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
et de changer la ligneRemainAfterExit=no
enRemainAfterExit=yes
, d'effectuer unsystemctl daemon-reload
, et enfin unservice apache2 restart
sans effet.
Y a-t-il une explication au changement soudain de comportement? Existe-t-il une solution raisonnable pour restaurer le comportement précédent? Sinon, quelle serait la meilleure pratique pour déployer les modifications du code de l'application et donner à Apache (l' app
utilisateur) l' autorisation de le lire sans avoir à se connecter à une session SSH en tant que root
? La seule raison de se connecter app
était de limiter le besoin de se connecter comme root
au départ.
Je suis complètement perdu ici et je ne comprends pas comment tout a pu soudainement être brisé.
Réponses
La cause première de ceci est un changement dans la façon dont systemd (à partir de 219) gère les objets IPC créés par les utilisateurs connectés. Par défaut, il supprimera tous les objets IPC laissés après la déconnexion de l'utilisateur. Ceci s'applique à tous les utilisateurs non-système (uid> = 1000). Les utilisateurs système (uid <1000) ne sont pas concernés.
Depuis que vous avez modifié Apache pour qu'il s'exécute sous un utilisateur non système, chaque fois que vous vous déconnectez de ce compte utilisateur, systemd détruit tous les objets IPC d'Apache, et Apache se plaint alors de la perte de son mutex et meurt.
Vous pouvez modifier ce comportement en définissant RemoveIPC=no
dans /etc/systemd/logind.conf
(la valeur par défaut sur Ubuntu est yes
) et en redémarrant systemd-logind.service
.
Il est préférable de laisser Apache fonctionner en tant qu'utilisateur système (par exemple www-data
sur Ubuntu) et d'utiliser les autorisations et les ACL pour donner www-data
accès aux fichiers dont il a besoin en lecture / écriture.