事情本身不复杂,线索都在日志里。CentOS 7.9 的站点用户反馈登录后十几分钟就被踢回登录页,session 文件还在磁盘上,PHP 的 session.gc_maxlifetime 设的是 1440,cookie 的有效期是 7200。

第一反应是「PHP-FPM 池之间 gc_probability 设置不同,回收频率不一致」,验证下来不成立。

排查方向其实有限,先把可能性排一排。GC 按 gc_maxlifetime 判定过期,session 文件到点就被清掉,cookie 还在也没用。还有一种是session.save_path 被多个站点共用,一个站点的 GC 把别人的文件也扫了。

还有一种情况,负载均衡后端的机器时间不同步,过期判断提前触发。

先确认两边的有效期设置

php -i | grep -E 'session.gc_maxlifetime|session.cookie_lifetime'

随后把 GC 寿命调得比 cookie 长

sed -i 's#^session.gc_maxlifetime.*#session.gc_maxlifetime = 86400#' /etc/php.ini

给每个站点独立的 session 目录

mkdir -p /var/lib/php/session_site && chown www:www /var/lib/php/session_site

等前面都确认过,再重启 FPM 并观察登录保持时长

systemctl restart php-fpm && ls -l /var/lib/php/session_site | head

怎么算真的好了,看的是同一批现象。登录后连续空闲两小时再操作仍然在线,session 文件没有被提前清掉,各站点的 session 目录互不影响。

gc_maxlifetime 必须大于 cookie_lifetime,否则用户看着 cookie 还有效却已经掉线;多站点共用 save_path 时 GC 会互相误伤,按站点分开最稳。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189