过去一周左右我一直有这个问题。我一直在研究一个在Sessions上依赖HEAVILY的PHP项目。出于某种原因,我们在过去几天的会话中遇到了麻烦。知道为什么吗?
这是错误:
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 :(得分:14)
我发现我的php.ini试图将会话保存到/ var / lib / php / session而不是/ tmp
请检查您的ini文件并查看它们的保存位置(或将其设置到其他位置);然后确保该目录可由适当的进程写入
答案 1 :(得分:12)
只需将/ var / lib / php / session /的所有权从apache更改为nginx,而不是让世界读取。
$ sudo chown -R nginx:nginx / var / lib / php / session /
答案 2 :(得分:10)
由于运行php进程的用户可能没有写入/ tmp目录的权限而发生此错误
让所有用户都可以使用此表示
chmod 777 /tmp
导致相同问题的另一个原因是只读文件系统
如果/ dev / sda1挂载在/ tmp上并且由于写入繁重,您的文件系统可能会变为只读...
再次使其可重写使用此命令
mount -t ext3 -o rw,remount /dev/sda1 /tmp
答案 3 :(得分:8)
克里斯拉特利奇是对的, php有时会在/ var / lib / php / session /目录中保存会话 检查你的php.ini文件或 使用777权限创建目录
mkdir /var/lib/php/session
chmod -R 777 /var/lib/php/session
答案 4 :(得分:3)
似乎我在Linux上发现了一些有趣的东西。在chroot php-cgi中,当某些PHP软件尝试读/写会话时会产生相同的错误。我认为这可能是权限问题,但在设置777并将网络服务器的所有者设置为" / tmp"并在几小时后设置它,发现" urandom"设备在" / dev"需要工作。只需确保它找到或复制/制作并临时更改权限(仅用于检查然后安全地更改):
chmod 777 /dev/urandom
对我来说很奇怪,在某些PHP5.x版本中并不需要它,但在某些PHP7.x中需要存在。
答案 5 :(得分:1)
RHEL已决定/var/lib/php/session
包含php
。该软件包已决定在安装时始终重新创建/var/lib/php/session
目录,并始终将目录归属为root
所有,并将组设置为apache
,并且每个目录都具有完全权限且没有权限其他任何事情。因此,虽然此处的许多建议解决方案建议更改/var/lib/php/session
的权限,但这将导致将来出现问题。
https://bugzilla.redhat.com/show_bug.cgi?id=1146552
RHEL建议解决此问题的方法是创建自己的会话目录,无论您希望将其存储在何处,并根据需要设置权限。未来的php更新不会影响新的位置,一切都应该继续工作。
对我来说效果很好的替代方法是简单地将nginx
添加到apache
群组。
答案 6 :(得分:1)
我刚刚在CentOS上进行了PHP升级。我不得不更改/etc/php-fpm.d/www.conf并更新php_value [session.save_path]变量并将其设置为/ tmp
php_value[session.save_path] = /tmp
这很好。 我认为这不会造成安全隐患。
答案 7 :(得分:1)
使用NGINX且服务器授予apache而不是nginx的权限时,您可能会收到此错误。
我的解决方法是:
chown -R nginx:nginx /var/lib/php/
使用chown可以更改特定文件夹的所有者,-R表示其递归。