【Linux】关于 php:(nginx / selinux)会话权限被拒绝但创建了文件

admin / Linux / / 374 字 · 约 2 分钟 / 466 次阅读 /
📑 文章章节大纲 (点击平滑直达)

一、问题现象

在 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)模式打开会话文件。

三、解决方案

使用 semanagerestorecon 赋予会话目录读写上下文标签:

# 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

配置生效后无需重启服务,刷新页面即可正常读写会话。

admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。