CentOS 7.9 上 nginx 1.20 托管一个纯静态站,首页 index.html 能打开,从二级目录取图片全部 403,站点目录 chmod -R 755、文件 644,nginx 用户也加了组,还是不行。
一开始怀疑是「SELinux 的 httpd_sys_content_t 没打上,读文件被拒」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。上层某个父目录缺执行权限,子目录给到 755 也进不去。也可能是nginx.conf 里 autoindex 关着,目录请求本来就该 403。
还有一种情况,location 里漏了 index 指令,目录请求走到禁止列表。
上来先逐个父目录检查执行权限
namei -l /www/wwwroot/site/images/a.png
然后看 error_log 里拒绝的具体原因
tail -50 /var/log/nginx/error.log | grep -iE 'denied|forbidden'
随后确认 SELinux 上下文是否正确
ls -Zd /www/wwwroot/site && getenforce
补上正确的上下文再验证
semanage fcontext -a -t httpd_sys_content_t '/www/wwwroot/site(/.*)?' && restorecon -Rv /www/wwwroot/site
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
改完先别撤,确认这几项。直接用浏览器请求图片返回 200,error_log 里不再出现 Permission denied 或 directory index is forbidden。
补一句。chmod 只解决 DAC 这一层,SELinux 开着时上下文不对照样拒绝;用 setenforce 0 验证完记得改回来。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
