nginx+php-fpm出现403错误且日志提示“(13: permission denied)”或“access to the script…has been denied”,核心原因是系统级访问控制拦截,需依次排查:nginx进程用户对文件路径的读/执行权限、php-fpm的security.limit_extensions限制、selinux/apparmor策略干预,以及nginx与php-fpm用户及socket权限匹配性。

当 Nginx + PHP-FPM 环境出现 403 错误,且错误日志中明确提示 (13: Permission denied) 或 “Access to the script … has been denied”,大概率是文件权限或安全策略层面的访问拦截,而非配置语法错误。排查需紧扣“谁在访问、访问哪、是否被允许”这条主线。
看错误日志,锁定具体拒绝点
先查最直接的线索:
- 执行 sudo tail -n 30 /var/log/nginx/error.log,找最近的 403 条目
- 重点识别关键词:
– open() "/path/to/file" failed (13: Permission denied) → 文件/目录系统权限问题
– FastCGI sent in stderr: "Access to the script '/xxx.php' has been denied (see security.limit_extensions)" → PHP-FPM 扩展名限制触发 - 若日志无内容,确认 nginx 配置中已启用 error_log(尤其虚拟主机块内),并用 nginx -t 验证语法
验证 Nginx 进程能否读取静态资源
Nginx worker 必须能进入整个路径并打开文件:
- 查 Nginx 用户:ps aux | grep "nginx: worker",看 USER 列(常见为 www-data 或 nginx)
- 模拟该用户访问:sudo -u www-data ls -l /your/root/path/index.html
若报 Permission denied,说明路径中某一级目录缺 x(执行)权限,或文件本身缺 r(读)权限 - 逐级检查权限:namei -l /your/root/path/index.html,观察每级目录的属主、属组和权限,特别注意 /var、/var/www、/your/site 是否都对 Nginx 用户有 x 权限
- 修复建议:
– 目录:chmod 755(rwxr-xr-x)
– 文件:chmod 644(rw-r--r--)
– 属组统一:chgrp www-data /your/site,再加组权限 chmod g+rx /your/site
验证 PHP-FPM 进程能否执行脚本
即使 Nginx 能读 index.html,PHP 脚本还需 PHP-FPM 进程能加载并运行:
- 查 PHP-FPM 运行用户:ps aux | grep php-fpm | grep master,看 USER 列(常为 www-data、apache 或自定义用户)
- 确认该用户能否读取 .php 文件:sudo -u www-data cat /your/site/test.php
- 检查 PHP-FPM 配置中的关键限制:
– 打开 /etc/php/*/fpm/pool.d/www.conf(路径依版本而异)
– 查 security.limit_extensions:默认只允 .php,若你请求的是 .html 或 .php5,需显式添加,如:
security.limit_extensions = .php .html .php5
– 查 listen.owner / listen.group 和 listen.mode:确保 Nginx 与 PHP-FPM 的 Unix socket 权限匹配(如 listen.mode = 0660,则 Nginx 用户必须属于 socket 所属组)
排除 SELinux / AppArmor 干预
在 CentOS/RHEL 或 Ubuntu 上,即使传统权限全开,安全模块仍可能拦截:
- SELinux 检查:sestatus;若为 enforcing,查拦截:ausearch -m avc -ts recent | grep nginx
- 临时放行测试:setsebool -P httpd_read_user_content 1 或重标目录上下文:chcon -R -t httpd_sys_content_t /your/site
- AppArmor 检查:aa-status | grep nginx;日志通常在 /var/log/syslog 中搜 “DENIED”
- 注意:不建议直接禁用 SELinux/AppArmor,应定位具体策略后精准调整
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











