nginx+php-fpm не работает session.gc_maxlifetime
Возникла проблема после перевода вэб-приложения с apache на nginx+php-fpm. В приложении реализована классическая аутентификация пользователей с сессиями + дополнительно куки. Куки ставятся только если установлена галочка типа "запомнить меня на час/сутки", галочки нет - только сессия (php функция session_start()
). Затем в сесиию/куки пишется кое-какая служебная инфа, не суть. Проблема заключается во времени жизни сесии. Если юзер не поставил галочку - в игре только сессия, которая имеет время жизни, например 1440 секунд. На апаче если время сессии истекает - то юзера перебрасывает на страницу ввода логин/пароля, а на nginx+php-fpm - она не "умирает по maxlifetime"
вот конфиг nginx
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 30000;
pid /var/run/nginx.pid;
pcre_jit on;
events {
worker_connections 1024;
multi_accept on;
}
http {
# Basic #######################
sendfile on;
tcp_nopush on;
tcp_nodelay on;
reset_timedout_connection on;
keepalive_timeout 120;
keepalive_requests 1000;
types_hash_max_size 4096;
server_tokens off;
send_timeout 30;
client_body_timeout 30;
client_header_timeout 30;
server_names_hash_max_size 4096;
# Limits ######################
client_max_body_size 10m;
client_body_buffer_size 128k;
large_client_header_buffers 8 64k;
client_body_temp_path /var/cache/nginx/client_temp;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/cache/nginx/proxy_temp;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logs ########################
log_format main '[$time_local] $remote_addr -> $host "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'rt=$request_time ut=$upstream_response_time '
'cs=$upstream_cache_status';
log_format full '$remote_addr - $host [$time_local] "$request" '
'request_length=$request_length '
'status=$status bytes_sent=$bytes_sent '
'body_bytes_sent=$body_bytes_sent '
'referer=$http_referer '
'user_agent="$http_user_agent" '
'upstream_status=$upstream_status '
'request_time=$request_time '
'upstream_response_time=$upstream_response_time '
'upstream_connect_time=$upstream_connect_time '
'upstream_header_time=$upstream_header_time';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
# Gzip ########################
gzip on;
gzip_static on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
gzip_comp_level 9;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;
etag off;
# Cache #######################
#proxy_cache_valid 1m;
#proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
#proxy_cache_path /path/nginx_cache levels=1:2 keys_zone=main:1000m;
# Zone limits ################
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=lim_5r:10m rate=5r/s; # lim for dynamic page
limit_req_zone $binary_remote_addr zone=lim_1r:10m rate=1r/s; # lim for search page
limit_req_zone $binary_remote_addr zone=lim_10r:10m rate=10r/s;
include /etc/nginx/conf.d/*.conf;
}
server {
#listen 443 ssl http2;
listen 192.168.111.100:80;
server_name test.local;
root /var/www/test.local/;
# index index.php index.html index.htm;
index index.php;
access_log /var/www/test.local/access.log main;
error_log /var/www/test.local/log/error.log;
charset utf-8;
location / {
try_files $uri $uri/ /index.php;
}
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff|woff2)$ {
access_log off;
expires max;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /var/www/test.local/;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /var/www/test.local$fastcgi_script_name;
include fastcgi_params;
#fastcgi_param QUERY_STRING $query_string;
#fastcgi_param REQUEST_METHOD $request_method;
#fastcgi_param CONTENT_TYPE $content_type;
#fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param HTTPS on;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
# fastcgi_ignore_headers;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location ~ /\.ht {
deny all;
}
}
Php-fpm не ругается, доступ к директории сессий есть у юзера, под которым трудится fpm и nginx (выставлен www-data). Если в приложении нажать выход, то перебрасывает на страницу лог-ина, приложение очищает сессию, всё работает, дальше логина не пропускает. А вот если не нажимать "выход", то через полчаса юзер так и останется в приложении, хотя сессия должна же уже "умереть" и приложение должно при обновлении страницы перебросить на страницу лог-ина, сессия же просрочена. Повторюсь - с апачем корректно работало.