CentOS 7.9 上扩完系统盘重启,站点所有用户都需要重新登录,检查发现 /var/lib/php/session 的属主变成 root 且权限是 700,PHP-FPM 是以 apache 用户跑的。

一开始怀疑是「SELinux 上下文在目录重建后也丢了,即使权限放对仍然写不进」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。目录被系统的临时文件机制按默认模板重建,属主和权限全部回到出厂值。也可能是权限 700 意味着只有 root 能进,PHP 进程连列出目录都做不到。

还有一种情况,多台机器各自存 session,重启后只有被重建的那台掉登录,看着像偶发。

上来先确认目录属主与 PHP 的会话路径

ls -ld /var/lib/php/session && php -i | grep session.save_path

再往下把属主与权限改回来

chown -R apache:apache /var/lib/php/session && chmod 770 /var/lib/php/session

恢复 SELinux 上下文

restorecon -R /var/lib/php/session && ls -Zd /var/lib/php/session

等前面都确认过,再重新加载后确认能写入

systemctl reload php-fpm && php -r 'var_dump(is_writable("/var/lib/php/session"));'

别只看报错消失,验证要多做一步。is_writable 返回 true,登录后刷新页面不再跳回登录页,目录下的 sess_ 文件属主是 apache 且时间戳持续更新。

session 放本地文件天然不跨机器,做负载均衡前就应该换成集中存储,否则每次扩缩容都是一次全员掉线。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189