it-swarm.com.ru

проблемы с сессиями php-fpm и nginx

У меня была эта проблема на прошлой неделе или около того. Я работал над проектом PHP, который использует HEAVILY для сессий. По некоторым причинам у нас были проблемы с сессиями, спасающими последние несколько дней. Есть идеи почему?

Вот ошибка:

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:

;;;;;;;;;;;;;;;;;;;;;
; 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;
                }
        }
}
12
Evan Darwin

Я обнаружил, что мой php.ini пытается сохранить сеансы в/var/lib/php/session, а не в/tmp

Так что проверьте свой INI-файл и посмотрите, где они сохраняются (или установите его в другом месте); затем убедитесь, что каталог доступен для записи соответствующими процессами

12
Chris Rutledge

Просто измените владельца/var/lib/php/session/на nginx из Apache, вместо того, чтобы читать мир.

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

11
joe mwirigi

эта ошибка произошла из-за того, что пользователь, который запускает процесс php, может не иметь разрешения на запись в каталог/tmp

чтобы сделать его доступным для записи всем пользователям, используйте эту рекомендацию

chmod 777 /tmp

другая причина, которая вызывает ту же самую проблему, является файловой системой только для чтения

если/dev/sda1 монтируется в/tmp и из-за интенсивной записи ваша файловая система может стать доступной только для чтения ...

чтобы сделать его снова перезаписываемым, используйте эту команду

mount -t ext3 -o rw,remount /dev/sda1 /tmp
10
khizar ansari

Крис Ратледж прав: Php иногда сохраняет сеансы в/var/lib/php/session/directory Проверьте ваш файл php.ini или Создайте каталог с правами 777

mkdir /var/lib/php/session
chmod -R 777 /var/lib/php/session
8
Dimitrios

Кажется, я нашел что-то интересное в Linux. В chroot php-cgi делает те же ошибки, когда некоторые программы PHP пытаются читать/записывать сеанс. Я думал, что это может быть проблема с разрешениями, но после установки 777 и установки владельца веб-сервера на «/ tmp» и установки его в «Через много часов» он обнаружил, что устройство «urandom» в «/ dev» должно было работать. Просто убедитесь, что он найден или скопируйте/сделайте его и временно измените разрешения (только для проверки, а затем смените на безопасное):

chmod 777 /dev/urandom

Странно для меня, что это не требуется в некоторых версиях PHP5.x, но в некоторых версиях PHP7.x должно быть.

2
Alex

Вы можете получить эту ошибку, когда используете NGINX, и сервер дает разрешение Apache вместо nginx.

Мое исправление:

chown -R nginx:nginx /var/lib/php/

С помощью chown вы изменяете владельца этой конкретной папки, а -R означает ее рекурсивную.

0
Marcelo Agimóvel

Я только что прошел обновление PHP в CentOS. Мне пришлось изменить /etc/php-fpm.d/www.conf и обновить переменную php_value [session.save_path] и установить ее в/tmp

php_value[session.save_path]    = /tmp

Это прекрасно работает ... Я не думаю, что это будет угрозой безопасности.

0
Nikhil Karkare

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.

0
Cameron Tacklind