一、问题现象
在 CentOS 7 环境中运行 Nginx + PHP-FPM,且系统启用了 SELinux。访问站点时在 Nginx 的错误日志 /var/log/nginx/error.log 中记录如下报错:
[error] FastCGI sent in stderr: "PHP message: PHP Warning: session_start(): open(/var/lib/php/session/sess_xxx, O_RDWR) failed: Permission denied (13) in /home/web/api/functions.php on line 9"
检查目录时发现 session 临时文件能够创建成功,但 PHP-FPM 却无法正常读取其内容。
二、原因定位
查看 /var/lib/php/session 的 SELinux 安全上下文标签:
ls -Zd /var/lib/php/session
# 输出类似:drwxrwx---. nginx nginx system_u:object_r:httpd_sys_content_t:s0 /var/lib/php/session
原因分析:当前目录的安全上下文为只读类型的 httpd_sys_content_t,Nginx/PHP-FPM 只有读权限或只能新建,而无法以读写(RW)模式打开会话文件。
三、解决方案
使用 semanage 与 restorecon 赋予会话目录读写上下文标签:
# 1. 永久添加读写上下文策略
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/lib/php/session(/.*)?"
# 2. 强制刷新并应用策略
sudo restorecon -Rv /var/lib/php/session
确保目录属主与 PHP-FPM 运行用户一致:
sudo chown -R nginx:nginx /var/lib/php/session
配置生效后无需重启服务,刷新页面即可正常读写会话。