selinux极可能在静默拦截,需先运行getenforce确认是否为enforcing模式;若是,执行sudo setenforce 0临时验证,再通过ausearch筛选nginx相关avc拒绝日志定位具体策略限制,推荐用semanage fcontext+restorecon赋予正确上下文,或修改/etc/selinux/config并重启禁用selinux。

Nginx 配置了 root 指令却返回 403,且日志里明确出现 (13: Permission denied),而文件权限、用户归属、索引文件都确认无误——这时候 SELinux 很可能在静默拦截。
直接看 SELinux 是否生效
运行命令:
getenforce
如果输出是 Enforcing,说明 SELinux 正在强制执行策略,极可能是它拦住了 Nginx 访问你自定义的 root 路径(比如 /home/www/public 或 /data/web)。
快速验证是不是 SELinux 导致的
临时切换为宽容模式(不重启):
sudo setenforce 0
然后刷新网页。如果 403 消失、页面正常加载,基本可断定是 SELinux 策略限制。
查具体哪条规则被触发
运行以下命令,筛选最近与 Nginx 相关的拒绝记录:
sudo ausearch -m avc -ts recent | grep nginx
典型输出类似:
type=AVC msg=audit(1722238901.123:456): avc: denied { read } for pid=12345 comm="nginx" name="index.html" dev="sda1" ino=67890 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file
其中 scontext 是 Nginx 进程的安全上下文,tcontext 是目标文件的安全上下文,tclass=file 和 read 被 deny,说明策略不允许该进程读该类文件。
永久解决(推荐两种方式)
-
方式一:给目标目录打上正确 SELinux 上下文(推荐)
比如你的root /data/www;,就给/data/www及其内容打上 Web 可读的标签:sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?" sudo restorecon -Rv /data/www
这样既保留 SELinux 保护,又放行合法 Web 访问。
-
方式二:彻底关闭 SELinux(仅限测试或可信内网环境)
编辑配置文件:sudo vi /etc/selinux/config
将
SELINUX=enforcing改为:SELINUX=disabled
保存后必须重启系统才生效。
注意:不要只改权限或切用户来绕过
即使你把目录 chmod 777 或把 user 改成 root,只要 SELinux 处于 Enforcing,它仍会按安全策略拒绝访问——这是独立于传统 Unix 权限的第二层控制。
提示:Ubuntu 系统用的是 AppArmor,排查逻辑类似,查 aa-status 和 /var/log/audit/audit.log。











