2012-02-08 29 views
9

He estado teniendo este problema durante la última semana más o menos. He estado trabajando en un proyecto de PHP que depende de HEAVILY en sesiones. Por alguna razón, hemos estado teniendo problemas con las sesiones que salvan los últimos días. ¿Alguna idea de por qué?problemas de sesión php-fpm y nginx

Aquí está el error: Versión

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:

nginx version: nginx/1.0.11 

PHP-FPM config:

;;;;;;;;;;;;;;;;;;;;; 
; 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; 
       } 
     } 
} 
+0

Por favor, compruebe/tmp modo, debería ser 777. También puedes ver audit.log selinux (si está instalada) –

Respuesta

10

este error se produjo debido a que el usuario que se ejecutan proceso PHP puede que no tenga permiso para escribir en el directorio/tmp

a darle permisos de escritura por todos los usuarios usan este commend

chmod 777 /tmp 

otra razón que hace que la misma cuestión es de sólo lectura del sistema de archivos

si/dev/sda1 se monta en/tmp y debido a la pesada escribir el sistema de archivos puede llegar a ser de sólo lectura ...

para que sea regrabable de nuevo utilizar este comando

mount -t ext3 -o rw,remount /dev/sda1 /tmp 
+0

i pensó que ... la mayoría de los usuarios están montando/tmp drive en un volumen separado ... dije "si" ...y antes de publicar cualquier pregunta en stackoverflow, compruebe primero el código de su programa ... –

+4

@SmilingDevil: votar a las personas que intentan ayudar mejor es un poco duro, ¿no crees? –

10

me encontré con que mi php.ini estaba tratando de guardar las sesiones a/var/lib/php/sesión en lugar de/tmp

a fin de comprobar su archivo ini y ver dónde se están guardando en (o configurarlo en otro lugar); a continuación, asegúrese de que el directorio se puede escribir mediante los procesos adecuados

+0

¿Por qué algunas instalaciones usan/var/lib/php5/y algo de uso/tmp ... etc.? – CMCDragonkai

+0

Sí, tuve el mismo problema, excepto para /var/lib/php/5.5/session. @CMCDragonkai Creo que sus parámetros lo das al compilarlo. –

+1

Tenga en cuenta que cuando actualiza NginX a yum (CentOS), de forma predeterminada cambia la propiedad de/var/lib/php a "apache": propiedad incorrecta. Esto me ha causado problemas antes. –

7

Chris Rutledge es correcto, php algunas veces es el ahorro SESIONES en/var/lib/php/session/directorio compruebe el archivo php.ini o crear el directorio con 777 derechos

mkdir /var/lib/php/session 
chmod -R 777 /var/lib/php/session 
+0

esto funcionó para mí; actualizar un servidor de CentOS 7 hizo que los permisos en esta carpeta salieran mal; el carro no contenía elementos, los usuarios no podían iniciar sesión y no se podía acceder al sitio de administración (aunque se validaba la información de inicio de sesión). – thanosa75

+0

Gracias por ese comentario, solucionó el problema de mi sesión también. ¿Pero no es un problema de seguridad configurar el 777 chmod en esa carpeta de sesión? gracias de antemano – pythoniosIV

+0

no estoy seguro acerca de la seguridad de estas soluciones además hice lo mismo, pero parece que se revierte cada vez que el servidor se reinicia – mahen3d

1

Parece que encontré algo interesante en el Linux. En el chroot, php-cgi comete los mismos errores cuando algún software de PHP intenta leer/escribir sesión. Pensé que esto podría ser un problema de permiso, pero después de configurar el 777 y establecer el propietario del servidor web en "/ tmp" y configurarlo en el Después de muchas horas, encontró que el dispositivo "urandom" en el "/ dev" necesitaba trabajarlo. Sólo asegúrese de que se encuentra o copiar/hacer y cambiar permisos temporales (sólo para verificación y luego cambiar a la seguridad):

chmod 777 /dev/urandom 

extraño que no se requiere de alguna versión pero en PHP5.x algunos PHP7.x necesitan estar allí.

+0

No entiendo. –

+0

Parece que los archivos de sesión de PHP necesitan un dispositivo generador aleatorio/dev/urandom para crear diferentes nombres de archivo, por lo que su servidor web debe acceder al/dev/urandom (en el servidor del sistema Linux). ¿Está bien? – Alex

+0

"chmod 777/dev/urandom" puede ayudar en este caso (solo para verificación y luego se deben corregir los permisos) – Alex

6

Simplemente cambie la propiedad de/var/lib/php/session/a nginx desde apache en lugar de dar una lectura mundial.

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