2012-02-08 39 views
9

Tôi đã gặp sự cố này trong tuần qua. Tôi đã làm việc trên một dự án PHP dựa trên HEAVILY trên Sessions. Vì lý do nào đó, chúng tôi đã gặp rắc rối với các phiên tiết kiệm trong vài ngày qua. Bất kỳ ý tưởng tại sao?Các vấn đề về phiên php-fpm và nginx

Dưới đây là các lỗi:

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 phiên bản:

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

Vui lòng kiểm tra/chế độ thư mục tmp, nó phải là 777. Ngoài ra kiểm tra selinux audit.log (nếu được cài đặt) –

Trả lời

10

lỗi này xảy ra do người dùng mà chạy quá trình php có thể không có quyền ghi vào thư mục/tmp

để làm cho nó có khả năng ghi được tất cả người dùng sử dụng khen thưởng này

chmod 777 /tmp 

một lý do khác mà gây giống nhau vấn đề là chỉ đọc hệ thống tập tin

nếu/dev/sda1 được gắn trên/tmp và do viết hệ thống tập tin của bạn có thể trở nên nặng chỉ đọc ...

để làm cho nó ghi lại một lần nữa sử dụng lệnh này

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

tôi nghĩ rằng nó ... hầu hết người dùng đang lắp/tmp ổ đĩa trên khối lượng riêng biệt ... tôi đã nói "nếu" ..và trước khi đăng bất kỳ quetion nào trên stackoverflow, hãy kiểm tra mã chương trình của bạn trước ... –

+4

@SmilingDevil: Bỏ phiếu cho những người cố gắng hết sức để giúp đỡ bạn có một chút khắc nghiệt không? –

10

tôi thấy rằng php.ini của tôi đã cố gắng để lưu các buổi đến/var/lib/php/phiên chứ không phải là/tmp

Vì vậy, kiểm tra tập tin ini của bạn và xem nơi họ đang được lưu vào (hoặc đặt nó ở một nơi khác); sau đó hãy chắc chắn rằng thư mục là có khả năng ghi bởi các quá trình thích hợp

+0

Tại sao một số cài đặt sử dụng/var/lib/php5/và một số sử dụng/tmp ... vv? – CMCDragonkai

+0

Vâng tôi có cùng một vấn đề, ngoại trừ /var/lib/php/5.5/session. @CMCDragonkai Tôi nghĩ rằng các thông số của nó bạn cung cấp cho nó khi bạn biên dịch nó. –

+1

Lưu ý, khi bạn nâng cấp NginX qua yum (CentOS), mặc định nó sẽ thay đổi quyền sở hữu/var/lib/php thành "apache" - quyền sở hữu sai! Điều này đã gây ra rắc rối cho tôi trước đây. –

7

Chris Rutledge là đúng, php một số lần là tiết kiệm sesions on/var/lib/php/phiên/thư mục kiểm tra file php.ini của bạn hoặc tạo thư mục với 777 quyền

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

điều này làm việc cho tôi; nâng cấp một máy chủ CentOS 7 gây ra các điều khoản trên thư mục này để đi sai; giỏ hàng không giữ các mặt hàng, người dùng không thể đăng nhập và trang web quản trị không thể truy cập được (mặc dù thông tin đăng nhập đã được xác thực). – thanosa75

+0

Cảm ơn nhận xét đó, nó cũng đã khắc phục sự cố phiên của tôi. Nhưng đó là không có vấn đề an ninh để thiết lập 777 chmod trên thư mục phiên đó? cảm ơn trước – pythoniosIV

+0

tôi không chắc chắn về bảo mật trên các giải pháp này cộng với tôi đã làm như vậy nhưng có vẻ như được khôi phục lại mọi lần khởi động lại máy chủ – mahen3d

1

Dường như tôi đã tìm thấy điều gì đó thú vị trên Linux. Trong chroot php-cgi có lỗi tương tự khi một số phần mềm PHP cố gắng đọc/ghi phiên. Tôi nghĩ rằng đây có thể là vấn đề quyền, nhưng sau khi thiết lập 777 và đặt chủ sở hữu của máy chủ web thành "/ tmp" và đặt nó trong Sau nhiều giờ, nó thấy rằng "urandom" thiết bị trong "/ dev" cần thiết để làm việc đó. Chỉ cần đảm bảo rằng nó được tìm thấy hoặc sao chép/tạo và thay đổi quyền tạm thời (chỉ để kiểm tra và sau đó thay đổi thành an toàn):

chmod 777 /dev/urandom 

Lạ với tôi rằng nó không được yêu cầu trong một số phiên bản PHP5.x nhưng một số PHP7.x cần phải có.

+0

Tôi không hiểu. –

+0

Dường như các tệp phiên PHP cần thiết bị phát ngẫu nhiên/dev/urandom để tạo các tên tệp khác nhau, vì vậy máy chủ web của bạn nên truy cập/dev/urandom (trên máy chủ trong hệ thống Linux). Là nó ổn? – Alex

+0

"chmod 777/dev/urandom" có thể trợ giúp trong trường hợp này (chỉ để kiểm tra và sau đó quyền truy cập phải được sửa) – Alex

6

Chỉ cần thay đổi quyền sở hữu/var/lib/php/session/thành nginx khỏi apache thay vì cho thế giới đọc.

$ sudo chown -R nginx: nginx/var/lib/php/phiên/

Các vấn đề liên quan