SELinux状态需用sestatus查启用状态与当前模式,getenforce查实时模式,ls -Z查文件上下文,chcon/semanage/restorecon修复并持久化httpd_sys_content_t标签。

SELinux 是 CentOS/RHEL 系统上最常被忽略却影响最深的“静默拦截者”——它不报错、不写明确日志,只让 Nginx 返回 403 或 404,尤其在使用 root 或 alias 配置静态资源时极易中招。
确认 SELinux 是否启用并正在拦截
运行以下命令快速判断:
-
sestatus—— 若输出 enforcing,说明 SELinux 正在强制执行策略 -
sudo setenforce 0—— 临时切换为 permissive 模式(不生效策略,只记录) - 刷新页面或
curl请求对应静态资源(如/css/app.css),若 403/404 消失,基本可锁定是 SELinux 干预
检查文件与目录的 SELinux 上下文
Nginx 默认只能读取标记为 httpd_sys_content_t 的文件和目录。用 ls -Z 查看真实上下文:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
ls -Z /var/www/html—— 应显示类似system_u:object_r:httpd_sys_content_t:s0 -
ls -Z /var/www/html/css/app.css—— 文件也需同属该类型,否则即使路径、权限全对,Nginx 仍无法读取 - 若显示
unconfined_u:object_r:default_t:s0或user_home_t等非 Web 相关类型,就是问题根源
修复上下文并持久化
不要只用 chcon 临时修改,必须结合 semanage 做规则持久化:
- 临时修复(验证用):
sudo chcon -R -t httpd_sys_content_t /var/www/html - 永久生效(推荐):
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" - 应用新规则:
sudo restorecon -Rv /var/www/html - 若配置的是非标准路径(如
/data/web/static),同样要为该路径添加 fcontext 规则
特别注意 alias 和 root 的路径差异对 SELinux 的影响
alias 和 root 拼出的物理路径不同,SELinux 检查的是最终访问路径,不是配置路径:
-
location /static/ { alias /mnt/assets/; }→ 实际检查/mnt/assets/logo.png的上下文 -
location /static/ { root /mnt; }→ 实际检查/mnt/static/logo.png的上下文 - 两个路径可能分属不同挂载点、不同 SELinux 策略域,需分别检查
ls -Z输出 - 若
/mnt是 NFS 或 ext4 外挂盘,可能默认继承default_t,必须显式重标

















