Das Beenden von SSH-Sitzungen beendet plötzlich Apache

Das Beenden von SSH-Sitzungen beendet plötzlich Apache

Okay, das ist ein Knaller. Ich verwende Apache 2.4 auf Ubuntu 16.04-Serverinstanzen. Ich verwende nahezu identische Umgebungen für Produktions- und Testinstanzen sowie eine nahezu identische VirtualBox-Instanz, die ich für die Entwicklung mit Vagrant verwalte. Lange Zeit konnte ich mich per SSH mit dem gleichen Benutzer verbinden, unter dem Apache läuft, einige Änderungen am Anwendungscode vornehmen und dann exitdie SSH-Sitzung beenden. Danach lief Apache einwandfrei. Jetzt kann ich jedoch keine Verbindung herstellen, exitohne dass beim Apache-Dienst ein schwerwiegender Fehler auftritt:

[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!

Anmerkungen:

  • Der Apache-Benutzer ist app.
  • Wenn ich SSH als appausführe, zu wechsle root, restartden Dienst als rootausführe, zurück zu wechsle appund dann die Sitzung beende, wird Apache beendet.
  • Wenn ich den Dienst per SSH betreibe rootund restartdann die Sitzung beende, ist Apache in Ordnung.
  • Wenn ich per SSH den Dienst verwende root, restartzu wechsle app, zurück zu wechsle rootund dann die Sitzung beende, ist Apache einwandfrei.
  • Wenn ich per SSH als rootden restartDienst betreibe, die Sitzung beende, erneut als SSH verwende appund dann die Sitzung erneut beende, wird Apache beendet.
  • Vor dieser Woche konnte ich durchgehend SSH als ausführen app, zu wechseln root, restartden Dienst als ausführen rootund die Sitzung beenden, ohne Apache zu beenden.
  • Ich habe versucht, /lib/systemd/system/apache2.service.d/apache2-systemd.confdie Zeile zu modifizieren und RemainAfterExit=noin zu ändern RemainAfterExit=yes, habe ein systemctl daemon-reloadund schließlich ein ausgeführt, jedoch service apache2 restartohne Wirkung.

Gibt es eine Erklärung für die plötzliche Verhaltensänderung? Gibt es eine vernünftige Lösung, um das vorherige Verhalten wiederherzustellen? Wenn nicht, was wäre dann die beste Vorgehensweise, um Änderungen am Anwendungscode vorzunehmen und Apache (dem appBenutzer) die Berechtigung zu erteilen, ihn zu lesen, ohne sich bei einer SSH-Sitzung als anmelden zu müssen root? Der einzige Grund für die Anmeldung als appbestand darin, die Notwendigkeit einer Anmeldung als rootvon vornherein zu begrenzen.

Ich bin völlig ratlos und verstehe nicht, wie auf einmal alles kaputt sein kann.

Antwort1

Die Hauptursache hierfür ist eine Änderung in der Art und Weise, wie systemd (ab 219) mit IPC-Objekten umgeht, die von angemeldeten Benutzern erstellt wurden. Standardmäßig werden alle verbleibenden IPC-Objekte entfernt, nachdem sich der Benutzer abgemeldet hat. Dies gilt für alle Nicht-Systembenutzer (UID >= 1000). Systembenutzer (UID < 1000) sind nicht betroffen.

Da Sie Apache so geändert haben, dass es unter einem Nicht-Systembenutzer ausgeführt wird, löscht systemd jedes Mal, wenn Sie sich von diesem Benutzerkonto abmelden, alle IPC-Objekte von Apache. Apache beschwert sich dann über den Verlust seines Mutex und stürzt ab.

Sie können dieses Verhalten ändern, indem Sie es RemoveIPC=noin einstellen /etc/systemd/logind.conf(die Standardeinstellung unter Ubuntu ist yes) und neu starten systemd-logind.service.

Es ist besser, Apache als Systembenutzer laufen zu lassen (z. B. www-dataunter Ubuntu) und Berechtigungen und ACLs zu verwenden, um www-dataZugriff auf die Dateien zu gewähren, die er lesen/schreiben muss.

verwandte Informationen