Quitter des sessions SSH tuant soudainement Apache

Aug 18 2020

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 exitpour mettre fin à la session SSH, et Apache fonctionnerait très bien par la suite. . Maintenant, cependant, je ne peux pas faire un exitsans 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, restartle service en tant que root, je reviens à app, puis je mets fin à la session, cela tue Apache.
  • Si je SSH root, restartle 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.restartapproot
  • Si je SSH root, restartle service, mettre fin à la session, SSH à nouveau comme app, puis mettre fin à la session à nouveau, il tue Apache.
  • Avant cette semaine, je suis en mesure de toujours SSH app, passez root, restartle service que root, et mettre fin à la session sans tuer Apache.
  • J'ai essayé de modifier /lib/systemd/system/apache2.service.d/apache2-systemd.confet de changer la ligne RemainAfterExit=noen RemainAfterExit=yes, d'effectuer un systemctl daemon-reload, et enfin un service apache2 restartsans 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' apputilisateur) 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 rootau départ.

Je suis complètement perdu ici et je ne comprends pas comment tout a pu soudainement être brisé.

Réponses

25 MichaelHampton Aug 18 2020 at 09:43

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=nodans /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-datasur Ubuntu) et d'utiliser les autorisations et les ACL pour donner www-dataaccès aux fichiers dont il a besoin en lecture / écriture.