it-swarm.com.de

php-fpm und nginx sitzungsprobleme

Ich habe dieses Problem in der letzten Woche oder so gehabt. Ich habe an einem PHP Projekt gearbeitet, das HEAVILY auf Sessions verlässt. Aus irgendeinem Grund hatten wir Probleme mit den Sitzungen, die in den letzten Tagen gespart wurden. Irgendeine Idee warum?

Hier ist der Fehler:

Warning: Unknown: open(/tmp/sess_mmd0ru5pl2h2h9bummcu1uu620, O_RDWR) failed: Permission denied (13) in Unknown on line 0 Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0
Warning: session_start(): open(/tmp/sess_mmd0ru5pl2h2h9bummcu1uu620, O_RDWR) failed: Permission denied (13)

nginx-Version:

nginx version: nginx/1.0.11

PHP-FPM-Konfiguration: 

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
include=/etc/php-fpm.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Default Value: none
pid = /var/run/php-fpm/php-fpm.pid

; Error log file
; Default Value: /var/log/php-fpm.log
error_log = /var/log/php-fpm/error.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
;daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; See /etc/php-fpm.d/*.conf

nginx.conf:

#######################################################################
#
# This is the main Nginx configuration file.
#
# More information about the configuration options is available on
#   * the English wiki - http://wiki.nginx.org/Main
#   * the Russian documentation - http://sysoev.ru/nginx/
#
#######################################################################

#----------------------------------------------------------------------
# Main Module - directives that cover basic functionality
#
#   http://wiki.nginx.org/NginxHttpMainModule
#
#----------------------------------------------------------------------

user              nginx nginx;
worker_processes  5;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


#----------------------------------------------------------------------
# Events Module
#
#   http://wiki.nginx.org/NginxHttpEventsModule
#
#----------------------------------------------------------------------

events {
    worker_connections  4096;
}


#----------------------------------------------------------------------
# HTTP Core Module
#
#   http://wiki.nginx.org/NginxHttpCoreModule
#
#----------------------------------------------------------------------

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

        index index.php index.html index.htm;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # Load config files from the /etc/nginx/conf.d directory
    # The default server is in conf.d/default.conf
    include /etc/nginx/conf.d/*.conf;
        server {
                listen 80;
                server_name stats.smilingdevil.com;

                error_page   404   /404.php;

                root /var/www;

                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;

                location / {
                        set $page_to_view "/index.php";
                        try_files $uri $uri/ @rewrites;
                        root /var/www/;
                        index index.php;
                }

                location @rewrites {
                        if ($uri ~* ^/([a-z0-9]+)$) {
                                set $page_to_view "/$1.php";
                                rewrite ^/([a-z]+)$ /$1.php last;
                        }
                }

                location ~ \.php$ {
                        include /etc/nginx/fastcgi.conf;
                        fastcgi_pass 127.0.0.1:9000;
                        fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
                }
        }
}
12
Evan Darwin

Ich habe festgestellt, dass meine php.ini versucht, Sitzungen in/var/lib/php/session statt in/tmp zu speichern

Überprüfen Sie Ihre Ini-Datei und prüfen Sie, wo sie gespeichert werden (oder legen Sie sie an einem anderen Ort ab). Stellen Sie dann sicher, dass das Verzeichnis von den entsprechenden Prozessen beschrieben werden kann

12
Chris Rutledge

Ändern Sie einfach den Besitz von/var/lib/php/session/in nginx von Apache, anstatt eine Weltlesefunktion zu erteilen.

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

11
joe mwirigi

dieser Fehler ist aufgetreten, weil der Benutzer, der den PHP-Prozess ausführt, möglicherweise keine Berechtigung zum Schreiben in das Verzeichnis/tmp hat

um es für alle Benutzer schreibbar zu machen, verwenden Sie dieses Kommando

chmod 777 /tmp

ein weiterer Grund, der dasselbe Problem verursacht, ist das Nur-Lese-Dateisystem

wenn/dev/sda1 auf/tmp eingehängt ist und Ihr Dateisystem aufgrund von starkem Schreibzugriff möglicherweise schreibgeschützt wird ...

verwenden Sie diesen Befehl, um ihn erneut zu beschreiben

mount -t ext3 -o rw,remount /dev/sda1 /tmp
10
khizar ansari

Chris Rutledge hat recht, Php speichert manchmal Sitzungen im Verzeichnis/var/lib/php/session /

mkdir /var/lib/php/session
chmod -R 777 /var/lib/php/session
8
Dimitrios

Anscheinend habe ich unter Linux etwas Interessantes gefunden. In der chroot machen php-cgi dieselben Fehler, wenn einige PHP -Software versuchen, eine Sitzung zu lesen/schreiben. Ich dachte, dies könnte ein Erlaubnisproblem sein, aber nachdem 777 gesetzt und der Besitzer des Webservers auf "/ tmp" gesetzt und in den After-Stunden eingestellt war, stellte er fest, dass "urandom" im "/ dev" -Gerät funktionieren musste. Stellen Sie einfach sicher, dass es gefunden oder kopiert/erstellt wurde, und ändern Sie die Berechtigungen temporär (nur zur Überprüfung und dann zu sicher ändern):

chmod 777 /dev/urandom

Seltsam für mich, dass es in einigen PHP5.x-Versionen nicht erforderlich war, aber in einigen PHP7.x-Dateien muss es vorhanden sein.

2
Alex

Diese Fehlermeldung wird möglicherweise angezeigt, wenn Sie NGINX verwenden und der Server die Berechtigung für Apache anstelle von Nginx erteilt.

Mein Fix ist:

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

Mit chown ändern Sie den Besitzer dieses bestimmten Ordners und -R bedeutet rekursiv.

0

Ich habe gerade ein Upgrade von PHP auf CentOS durchgeführt. Ich musste /etc/php-fpm.d/www.conf ändern und die Variable php_value [session.save_path] aktualisieren und auf/tmp setzen

php_value[session.save_path]    = /tmp

Das funktioniert gut ... Ich glaube nicht, dass dies ein Sicherheitsrisiko darstellt.

0
Nikhil Karkare

RHEL hat entschieden, dass /var/lib/php/session dem Paket php gehört. Dieses Paket hat entschieden, dass das Verzeichnis /var/lib/php/session bei der Installation immer neu erstellt wird und das Verzeichnis immer in den Besitz von root zurückgesetzt wird, wobei die Gruppe auf Apache gesetzt ist und alle Berechtigungen hat, und für alle anderen Berechtigungen. Während viele Lösungsvorschläge hier die Änderung der Berechtigungen von /var/lib/php/session vorschlagen, wird dies in der Zukunft Probleme verursachen.

https://bugzilla.redhat.com/show_bug.cgi?id=1146552

Die von RHEL empfohlene Methode zur Behebung dieses Problems besteht darin, ein eigenes Sitzungsverzeichnis zu erstellen, wo immer Sie es speichern möchten, und die Berechtigungen nach Bedarf festzulegen. Zukünftige PHP-Updates wirken sich nicht auf den neuen Standort aus und alles sollte funktionieren.

Eine Alternative, die für mich sehr gut funktioniert hat, ist, einfach nginx zur Gruppe Apache hinzuzufügen.

0