Mögliche Kollision separater PHP-FPM-Pools mit Sitzungs-IDs

Mögliche Kollision separater PHP-FPM-Pools mit Sitzungs-IDs

Ich betreibe einen Server mit nginx 1.12.2 und PHP 7.0.27 unter Debian 8.10. Ich betreibe zwei Websites mit separaten PHP-FPM-Pools für jede einzelne PHP-Anwendung, die auf jeder Site ausgeführt wird. Jeder PHP-FPM-Pool und damit jede PHP-App läuft unter einem eigenen Benutzer, wobei nginx als www-data ausgeführt wird.

Manchmal (ich glaube, zu Zeiten hoher Auslastung) erhalte ich von PHP Fehlermeldungen über Probleme beim Lesen und Schreiben der Sitzungsdateien bis hin zu Berechtigungen, zum Beispiel:

2018/02/21 02:07:19 [error] 11723#11723: *804992 FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open(/var/lib/php/sessions/sess_<session id here>, O_RDWR) failed: Permission denied (13) in Unknown on line 0 PHP message: PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/sessions) in Unknown on line 0" while reading upstream, client: 34.242.193.225, server: example.org, request: "GET /somepage HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm-site-app.sock:", host: "example.org"

Soweit ich das beurteilen kann, sind die Berechtigungen korrekt, da ich im Ordner Sitzungen von beiden PHP-Benutzern sehe.

Wenn ich ein „ls -alF“ auf den in der Fehlermeldung angegebenen Dateinamen ausführe, kurz nachdem er in der Protokolldatei angezeigt wird, ist die Datei dort, aber im Besitz des Benutzers der anderen Site (mit Inhalten, die darauf hindeuten, dass sie für eine Sitzung der anderen Site ist), was für mich bedeutet, dass beide auf unterschiedlichen Domänen ausgeführten Apps dieselbe Sitzungs-ID generiert haben und eine ihre Datei erfolgreich schreiben kann, während die andere fehlschlägt, weil die Datei existiert und dem Benutzer der anderen Site gehört. So wie ich das verstehe, sollte die Wahrscheinlichkeit, dass beide Sites dieselbe Sitzungs-ID generieren, so gut wie unmöglich sein.

Obwohl ich glaube, dass ich die Symptome beheben kann, indem ich für jeden Pool separate Sitzungspfade festlege, glaube ich nicht, dass sich dadurch das zugrunde liegende Problem lösen lässt, das möglicherweise andere Probleme auf dem Server verursacht, die mir bisher nicht aufgefallen sind.

Antwort1

Dies ist eigentlich ein Softwareproblem, kein nginxoder php-fpm, und wenn Sie dieselbe Software in zwei Prozessen ausführen, ist es nicht unmöglich, dass es zu Kollisionen kommt. Ein kurzer Blick in die Dokumentation deutet darauf hin, dass es zwar eine Kollisionserkennung für eine einzelne Anwendung gibt, zwei separate Prozesse in unterschiedlichen Benutzerbereichen dies jedoch nicht tun würden. Die einfachste Lösung wäre, session.save_pathfür jeden Pool eine andere Konfiguration vorzunehmen.

verwandte Informationen