Welche Berechtigungen / Eigentumsrechte müssen für den PHP-Sitzungsordner festgelegt werden, wenn FastCGI / PHP-FPM ausgeführt wird (als Benutzer "nobody")?

17

Ich habe Probleme, eine Reihe von Skripten zum Laufen zu bringen, da PHP-FPM nicht in meinen Sitzungsordner schreiben kann:

"2009/10/01 23:54:07 [error] 17830 # 0: * 24 FastCGI gesendet in stderr:" PHP Warning:
    Unbekannt: open (/ var / lib / php / session / sess_cskfq4godj4ka2a637i5lq41o5, O_RDWR)
    fehlgeschlagen: Berechtigung verweigert (13) in Unbekannt in Zeile 0
PHP-Warnung: Unbekannt: Fehler beim Schreiben der Sitzungsdaten (Dateien). Bitte überprüfen
    dass die aktuelle Einstellung von session.save_path korrekt ist
    (/ var / lib / php / session) in Unknown in Zeile 0 "beim Upstream-Lesen"

Offensichtlich handelt es sich hierbei um eine Berechtigungsfrage. Der Besitzer / die Gruppe meines Sitzungsordners ist der Benutzer des Webservers, NGINX. PHP-FPM läuft so, als nobodyob, und daher ist es nicht so trivial, es der Nginx-Gruppe hinzuzufügen.

Eine vorübergehende Lösung besteht darin, die Berechtigungen für /var/lib/php/sessionfestzulegen 777- ich habe jedoch das Gefühl, dass dies nicht die "beste Vorgehensweise" ist.

Was ist die beste Vorgehensweise, wenn Sie einem Ordner einen Daemon-Schreibzugriff zuweisen müssen, der jedoch als ausgeführt wird nobody?

Professor Frink
quelle

Antworten:

24

Die richtigen Berechtigungen für uns wo

chown -R nobody:nogroup /var/lib/php/session

as php-cgiläuft als nobody, obwohl NGinx als Benutzer läuftnginx

Judder
quelle
In meinem Fall handelte es sich nicht um Eigentum / Berechtigungen. Entferne die "3;" from session.save_path = "3; / var / lib / php / sessions"
John Doe
1
Ich erhalte die folgende Fehlermeldung: Ungültige Gruppe << nobody: nogroup >> :(
Pathros
Ich konnte sehen nobody, wer mein Benutzer ist, der PHP mit dieser Codezeile ausführt: <?php echo exec('whoami'); ?>(in meinem Fall www-data) und danach war es so einfach wie gerade geschrieben. chown -R www-data:www-data /var/lib/php/sessionsDies ist ein unterschätztes Google-Ergebnis, da es die einzige Antwort war, die es half mich nach stundenlangem suchen! Vielen Dank!
Dimitar
9

Manchmal, wenn Sie das System aktualisieren, wird die Gruppe von /var/lib/php/sessionzu Apache geändert.

Versuchen Sie, auszuführen, sudo chgrp nginx /var/lib/php/*anstatt die Berechtigungen auf 777 zu setzen, was eine schlechte Praxis ist.

Das hat zumindest bei mir funktioniert.

Nick G
quelle
1
Dies sollte als akzeptierte Antwort markiert werden.
Yuda Prawira
3

Verwenden /etc/php.ini Sie die Anweisung session.save_path .

Eine vorübergehende Lösung besteht darin, die Berechtigungen von / var / lib / php / session auf 777 zu setzen - ich habe jedoch das Gefühl, dass dies nicht die "beste Vorgehensweise" ist.

"Wenn Sie diesen Satz in einem von der Welt lesbaren Verzeichnis belassen, können andere Benutzer auf dem Server möglicherweise Sitzungen entführen, indem sie die Liste der Dateien in diesem Verzeichnis abrufen."

SaveTheRbtz
quelle
Entschuldigung, ich glaube, ich war mir nicht sicher: session.save_path ist bereits auf / var / lib / php / session gesetzt. Das Problem ist, dass ich nicht herausfinden kann, welche Berechtigungen und Eigentümer dem Sitzungspfadverzeichnis zugewiesen werden müssen, damit PHP-FPM darauf schreiben und es sicher aufbewahren kann. Wenn das Verzeichnis als Eigentümer / Gruppe "nginx" (der Webserver, auf dem ich arbeite) und die Berechtigungen 755 festgelegt sind, reicht das anscheinend nicht aus
Professor Frink,
4
1. Verwenden Sie denselben Benutzer: Gruppe für nginx und php-fpm (entweder über nginx.confoder php-fpm.conf), so dass Sie mit diesem Verzeichnis 700. 2. Verwenden Sie halten können , chown -R nginx:nobody /var/lib/php/session && chmod -R 770 /var/lib/php/sessionso denke ich beide nginx und php-fpm es verwenden können
SaveTheRbtz
2
Ich kann bestätigen, dass die Verwendung von nginx: nobody (oder unter bestimmten Umständen von nginx: nogroup) funktioniert. Wenn es möglich ist, würde ich mich jedoch an SaveTheRbtz 'Option 1 halten.
Michael Johnson
3

Ich musste einen Ordner mit 0700-Rechten in / var / lib / php / session für jeden php-fpm-Pool erstellen.

Besitzer dieses Ordners sind Benutzer und Gruppen aus dem php-fpm-Pool.

Und / var / lib / php / session jetzt 0777.

Ich denke, diese Methode ist am sichersten. Nur Benutzer des php-fpm-Pools können diese Sitzungen sehen.

Alexander Merkulov
quelle
1

Ich hatte das gleiche Problem und ich habe es gelöst. Ich ging zu /tmp(dort sind meine ses_ * -Dateien) und löschte sie alle. Danach war alles in Ordnung.

Soweit ich das beurteilen konnte, versuchte das System, auf alte gesperrte Dateien zu schreiben.

Das Problem trat auf, nachdem ich mit gespielt hatte php.ini. Ich habe ein paar Jahre meines Lebens verloren, aber schließlich habe ich die Lösung gefunden.

Christos
quelle
1

Der richtige Weg sollte darin bestehen, den Besitz des Sitzungsordners in nginx zu ändern. PHP-FPM wird jedoch nicht standardmäßig mit dem Benutzer nginx ausgeführt. Standardmäßig wird Apache verwendet.

Vor diesem Hintergrund müssen Sie den von PHP-FPM verwendeten Benutzer durch Bearbeiten ändern /etc/php-fpm.d/www.conf.

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

Starten Sie PHP-FPM neu und Sie sollten einsatzbereit sein.

service php-fpm restart


Die Position des PHP-Sitzungspfads finden Sie /etc/php.iniunter session.save_path. /var/lib/php/sessionist die Standardeinstellung.

Befehl zum Aktualisieren des Besitzes und der Gruppe des PHP-Sitzungsordners

chown -R nginx:nginx /var/lib/php/session

Und du solltest auch mit chmod von gut auskommen 700.

Josephting
quelle
1

Das Verzeichnis / var / lib / php / sessions sollte über Sticky-Bit-Berechtigungen verfügen.

sudo chmod 1773 /var/lib/php/sessions

ls -al /var/lib/php/
drwxr-xr-x  4 root root   .
drwxr-xr-x 51 root root   ..
drwxr-xr-x  3 root root   modules
drwx-wx-wt  2 root root   sessions
Łukasz
quelle
0

Basierend auf der Antwort von @Judder musste ich den folgenden Befehl hinzufügen, um niemandem und nogroup Lese- und Schreibberechtigungen zu erteilen : chmod ändert die Berechtigungen für den angegebenen Ordner -R wendet dieselben Berechtigungen auf die erstellten Ordner und Dateien an innerhalb des angegebenen Ordners u für Benutzer g für Gruppe r für Leseberechtigung w für Schreibberechtigung

chown -R nobody:nogroup /var/lib/php/session

sudo chmod -R ug+rw /var/lib/php/sessions






Guillaume Genreau
quelle