php-fpm和nginx会话问题

时间:2012-02-08 23:41:05

标签: session nginx php

过去一周左右我一直有这个问题。我一直在研究一个在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;
                }
        }
}

8 个答案:

答案 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表示其递归。