web-dev-qa-db-fra.com

problèmes de session php-fpm et nginx

J'ai ce problème depuis environ une semaine. J'ai travaillé sur un projet PHP qui repose énormément sur les sessions. Pour une raison quelconque, nous avons eu des problèmes avec les sessions sauver ces derniers jours. Une idée pourquoi?

Voici l'erreur:

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)

version de nginx:

nginx version: nginx/1.0.11

Configuration PHP-FPM: 

;;;;;;;;;;;;;;;;;;;;;
; 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

J'ai trouvé que mon php.ini essayait de sauvegarder des sessions dans/var/lib/php/session plutôt que/tmp

Vérifiez donc votre fichier ini et voyez où il est enregistré (ou définissez-le ailleurs); puis assurez-vous que ce répertoire est accessible en écriture par les processus appropriés

12
Chris Rutledge

Il suffit de changer la propriété de/var/lib/php/session/en nginx depuis Apache au lieu de donner une lecture universelle.

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

11
joe mwirigi

cette erreur est survenue car l'utilisateur qui exécute le processus php n'est peut-être pas autorisé à écrire dans le répertoire/tmp

pour le rendre accessible en écriture pour tous les utilisateurs, utilisez cette recommandation

chmod 777 /tmp

une autre raison qui cause le même problème est le système de fichiers en lecture seule

si/dev/sda1 est monté sur/tmp et qu'en raison d'une écriture importante, votre système de fichiers risque de devenir en lecture seule ...

pour le rendre réinscriptible, utilisez cette commande

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

Chris Rutledge a raison, Php sauvegarde parfois des sessions sur le répertoire/var/lib/php/session /.

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

On dirait que j'ai trouvé quelque chose d'intéressant sur Linux. Dans le chroot, php-cgi commet les mêmes erreurs lorsque certains logiciels PHP tentent de lire/écrire des sessions. Je pensais que cela pouvait être un problème d’autorisation, mais après avoir défini 777 et défini le propriétaire du serveur Web sur "/ tmp" et l’a défini dans Après de nombreuses heures, il a été découvert que le périphérique "urandom" dans "/ dev" devait fonctionner. Assurez-vous simplement qu'il a trouvé ou copiez-le/modifiez-le et modifiez les autorisations temporairement (juste pour vérifier puis passer en toute sécurité):

chmod 777 /dev/urandom

Étrange pour moi, cela n’était pas requis dans certaines versions de PHP5.x mais dans certaines PHP7.x.

2
Alex

Vous pouvez obtenir cette erreur lorsque vous utilisez NGINX et que le serveur donne l'autorisation à Apache au lieu de nginx.

Ma solution est:

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

Avec chown, vous changez le propriétaire de ce dossier spécifique et -R signifie son récursif.

0
Marcelo Agimóvel

Je viens de passer à travers une mise à niveau de PHP sur CentOS. Je devais changer /etc/php-fpm.d/www.conf et mettre à jour la variable php_value [session.save_path] et la définir sur/tmp

php_value[session.save_path]    = /tmp

Cela fonctionne très bien ... Je ne pense pas que ce sera un risque pour la sécurité.

0
Nikhil Karkare

RHEL a décidé que /var/lib/php/session appartient au package php. Ce paquet a décidé qu'il recréera toujours le répertoire /var/lib/php/session lors de son installation et qu'il restituera toujours le répertoire appartenant à root avec un groupe défini sur Apache avec des autorisations complètes pour chacun et aucune autorisation pour rien d'autre. Par conséquent, bien que de nombreuses solutions suggérées ici suggèrent de modifier les autorisations de /var/lib/php/session, cela posera des problèmes à l'avenir.

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

Le moyen suggéré par RHEL de résoudre ce problème consiste à créer votre propre répertoire de session où vous souhaitez le stocker et à définir les autorisations nécessaires. Les futures mises à jour php n'affecteront pas ce nouvel emplacement et tout devrait continuer à fonctionner.

Une alternative qui a très bien fonctionné pour moi est d’ajouter simplement nginx au groupe Apache.

0
Cameron Tacklind