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 exit
die SSH-Sitzung beenden. Danach lief Apache einwandfrei. Jetzt kann ich jedoch keine Verbindung herstellen, exit
ohne 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
app
ausführe, zu wechsleroot
,restart
den Dienst alsroot
ausführe, zurück zu wechsleapp
und dann die Sitzung beende, wird Apache beendet. - Wenn ich den Dienst per SSH betreibe
root
undrestart
dann die Sitzung beende, ist Apache in Ordnung. - Wenn ich per SSH den Dienst verwende
root
,restart
zu wechsleapp
, zurück zu wechsleroot
und dann die Sitzung beende, ist Apache einwandfrei. - Wenn ich per SSH als
root
denrestart
Dienst betreibe, die Sitzung beende, erneut als SSH verwendeapp
und dann die Sitzung erneut beende, wird Apache beendet. - Vor dieser Woche konnte ich durchgehend SSH als ausführen
app
, zu wechselnroot
,restart
den Dienst als ausführenroot
und die Sitzung beenden, ohne Apache zu beenden. - Ich habe versucht,
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
die Zeile zu modifizieren undRemainAfterExit=no
in zu ändernRemainAfterExit=yes
, habe einsystemctl daemon-reload
und schließlich ein ausgeführt, jedochservice apache2 restart
ohne 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 app
Benutzer) 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 app
bestand darin, die Notwendigkeit einer Anmeldung als root
von 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=no
in 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-data
unter Ubuntu) und Berechtigungen und ACLs zu verwenden, um www-data
Zugriff auf die Dateien zu gewähren, die er lesen/schreiben muss.