2012-02-08 13 views
9

Ho avuto questo problema per la scorsa settimana o giù di lì. Ho lavorato su un progetto PHP che si basa HEAVILY su Sessions. Per qualche motivo abbiamo avuto problemi con le sessioni di salvataggio negli ultimi giorni. Qualche idea del perché?problemi di sessione php-fpm e nginx

Ecco l'errore: la versione

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

Si prega di verificare/modalità directory tmp, dovrebbe essere 777. Verificare anche SELinux audit.log (se installato) –

risposta

10

questo errore si è verificato a causa per l'utente che corrono processo php potrebbe non avere il permesso di scrivere su/tmp

per renderlo scrivibile da tutti gli utenti usano questo Commend

chmod 777 /tmp 

un altro motivo che fa sì che lo stesso problema è di sola lettura del file system

se/dev/sda1 è montato su/tmp e causa di pesanti scrivere il file system può diventare solo leggere ...

per renderlo di nuovo riscrivibile usare questo comando

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

ho pensato che ... la maggior parte degli utenti sta montando/tmp drive su un volume separato ... ho detto "if" ..e prima di postare qualsiasi quesione su StackOverflow checkout prima il codice del tuo programma ... –

+4

@SmilingDevil: votare le persone che ci provano meglio ad aiutare è un po 'duro non credi? –

10

ho trovato che il mio php.ini stava tentando di salvare le sessioni a/var/lib/php/session piuttosto che/tmp

in modo da controllare il file ini e vedere dove stanno venendo salvati (o impostarlo su un'altra parte); quindi assicurarsi che directory è scrivibile dai processi appropriati

+0

Perché alcune installazioni usano/var/lib/php5/e alcuni usano/tmp ... etc? – CMCDragonkai

+0

Sì, ho avuto lo stesso problema, tranne per /var/lib/php/5.5/session. @CMCDragonkai Penso che i suoi parametri tu gli dai quando lo compili. –

+1

Nota: quando si aggiorna NginX tramite yum (CentOS), per impostazione predefinita si cambia la proprietà di/var/lib/php in "apache" - proprietà errata! Questo mi ha causato problemi prima. –

7

Chris Rutledge è giusto, php a volte è il risparmio sesions in/var// php/session/lib controllare il vostro file php.ini o creare la directory con 777 diritti

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

questo ha funzionato per me; l'aggiornamento di un server CentOS 7 ha causato il malfunzionamento delle autorizzazioni su questa cartella; il carrello non conteneva elementi, gli utenti non potevano accedere e il sito di amministrazione non era accessibile (sebbene le informazioni di accesso fossero state convalidate). – thanosa75

+0

Grazie per questo commento, ha risolto anche il mio problema di sessione. Ma non c'è nessun problema di sicurezza per impostare il chmod 777 su quella cartella di sessione? grazie in anticipo – pythoniosIV

+0

non sono sicuro della sicurezza di queste soluzioni e ho fatto lo stesso, ma sembra essere ripristinato ogni volta che il server si riavvia – mahen3d

1

Sembra che io abbia trovato qualcosa di interessante su Linux. Nel chroot php-cgi si commettono gli stessi errori quando un software PHP tenta di leggere/scrivere la sessione. Pensavo che questo potesse essere un problema di autorizzazione, ma dopo aver settato 777 e impostato il proprietario del webserver su "/ tmp" e averlo impostato nel Dopo molte ore ho scoperto che il dispositivo "urandom" nel "/ dev" doveva funzionare. Basta fare in modo che ha trovato o copiare/fare e modificare le autorizzazioni temporanee (solo per il check e poi cambiare in modo sicuro):

chmod 777 /dev/urandom 

strano per me che non era necessaria una qualche versione PHP5.x ma in alcuni PHP7.x devono essere lì.

+0

Non capisco. –

+0

Sembra che i file di sessione di PHP necessitino di un dispositivo generatore casuale/dev/urandom per creare nomi di file diversi, quindi il tuo server web dovrebbe accedere a/dev/urandom (sul server nel sistema Linux). Va bene? – Alex

+0

"chmod 777/dev/urandom" può aiutare in questo caso (solo per controllo e quindi le autorizzazioni devono essere corrette) – Alex

6

Basta cambiare la proprietà di/var/lib/php/session/a nginx da apache invece di dare una lettura mondiale.

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