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;
}
}
}
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
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 /
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
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
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.
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.
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é.
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
.