文件在、权限也对(属主 nginx:nginx),Nginx 却读不到。真相在 SELinux 标签:
getenforce
sudo ls -lZ /data/static
目录标签是 default_t,而 Nginx 进程是 httpd_t,它默认读不了 default_t 的东西。两步走:
sudo semanage fcontext -a -t httpd_sys_content_t "/data/static(/.*)?"
sudo restorecon -Rv /data/static
sudo setenforce 1
标签改对之后,SELinux 就不是障碍了。
我自己挖的坑:/81 还是 :81
SELinux 修好,刷新还是 404。看 sudo tail -f /var/log/nginx/error.log,发现 Nginx 在找 /usr/share/nginx/html/favicon.ico——根本没用我配的 /data/static。再一看访问来源,我浏览器里输的是 http://IP/81(斜杠)而不是 http://IP:81(冒号)。斜杠被当成了路径,请求落到了默认 server 块(root 是 /usr/share/nginx/html),自然 404。改成冒号之后,/data/static/index.html 一下子就出来了。
顺手记的几个反向代理 502
后来拿 Nginx 做反向代理又碰了一圈 502,原因各不相同:后端没启动、location /api/ 少了个空格没生效、还有 SELinux 不让 Nginx 对外连网(要开 httpd_can_network_connect)。排反向代理除了看配置,记得 setsebool -P httpd_can_network_connect on 这一条很容易漏。
排错清单
| 现象 | 根因 | 解决 |
| 启动报 Job for nginx failed | 配置语法错(多了 }) | nginx -t 看行号 |
| 81 端口还是默认页 | default server 抢流量 | 禁掉 default.conf |
| :81 连不上 | 防火墙没放行 | firewall-cmd –add-port |
| 文件在却 404 | SELinux 标签不对 | semanage fcontext + restorecon |
| 访问 /81 报 404 | 把路径当端口(斜杠) | 用 :81 |
| 反代 502 | 后端没起 / SELinux 禁连网 | 起后端 / setsebool httpd_can_network_connect |
整个流程串下来就是:装 Nginx → 写 /etc/nginx/conf.d/static.conf → 建 /data/static/index.html → 修文件权限 → 修 SELinux 标签 → 防火墙放行端口。这几步顺序错了,哪个都可能卡你一下。
一开始 81 端口打不开,先别急着怀疑网络,先看 Nginx 本身:
sudo nginx -T | grep -A 10 "listen 81"
sudo systemctl status nginx
第一条能看出 81 端口和 root /data/static 到底有没有真正加载;第二条确认进程是活的。我这俩都没问题,说明锅不在 Nginx 自身。
防火墙:放行端口
firewall-cmd –list-all 一看,81 没放行。放行之后如果还是连不上,那多半是网络层问题;但我是报 404 而不是”无法连接”,说明 TCP 是通的,防火墙不是主因。
SELinux:最隐蔽的那个坑
文件在、权限也对(属主 nginx:nginx),Nginx 却读不到。真相在 SELinux 标签:
getenforce
sudo ls -lZ /data/static
目录标签是 default_t,而 Nginx 进程是 httpd_t,它默认读不了 default_t 的东西。两步走:
sudo semanage fcontext -a -t httpd_sys_content_t "/data/static(/.*)?"
sudo restorecon -Rv /data/static
sudo setenforce 1
标签改对之后,SELinux 就不是障碍了。
我自己挖的坑:/81 还是 :81
SELinux 修好,刷新还是 404。看 sudo tail -f /var/log/nginx/error.log,发现 Nginx 在找 /usr/share/nginx/html/favicon.ico——根本没用我配的 /data/static。再一看访问来源,我浏览器里输的是 http://IP/81(斜杠)而不是 http://IP:81(冒号)。斜杠被当成了路径,请求落到了默认 server 块(root 是 /usr/share/nginx/html),自然 404。改成冒号之后,/data/static/index.html 一下子就出来了。
顺手记的几个反向代理 502
后来拿 Nginx 做反向代理又碰了一圈 502,原因各不相同:后端没启动、location /api/ 少了个空格没生效、还有 SELinux 不让 Nginx 对外连网(要开 httpd_can_network_connect)。排反向代理除了看配置,记得 setsebool -P httpd_can_network_connect on 这一条很容易漏。
排错清单
| 现象 | 根因 | 解决 |
| 启动报 Job for nginx failed | 配置语法错(多了 }) | nginx -t 看行号 |
| 81 端口还是默认页 | default server 抢流量 | 禁掉 default.conf |
| :81 连不上 | 防火墙没放行 | firewall-cmd –add-port |
| 文件在却 404 | SELinux 标签不对 | semanage fcontext + restorecon |
| 访问 /81 报 404 | 把路径当端口(斜杠) | 用 :81 |
| 反代 502 | 后端没起 / SELinux 禁连网 | 起后端 / setsebool httpd_can_network_connect |
整个流程串下来就是:装 Nginx → 写 /etc/nginx/conf.d/static.conf → 建 /data/static/index.html → 修文件权限 → 修 SELinux 标签 → 防火墙放行端口。这几步顺序错了,哪个都可能卡你一下。
作者:司陌笙
环境:Rocky Linux 9
标签:Nginx、排错、运维学习
我想干啥
在 Rocky Linux 9 上用 Nginx 起一个静态资源服务器,开 80 和 81 两个站点专门放静态文件。结果从启动到能访问,一路踩了 SELinux、防火墙、还有我自己手滑的坑。下面把排错过程记下来,省得下次又忘。
先确认 Nginx 自己没毛病
一开始 81 端口打不开,先别急着怀疑网络,先看 Nginx 本身:
sudo nginx -T | grep -A 10 "listen 81"
sudo systemctl status nginx
第一条能看出 81 端口和 root /data/static 到底有没有真正加载;第二条确认进程是活的。我这俩都没问题,说明锅不在 Nginx 自身。
防火墙:放行端口
firewall-cmd –list-all 一看,81 没放行。放行之后如果还是连不上,那多半是网络层问题;但我是报 404 而不是”无法连接”,说明 TCP 是通的,防火墙不是主因。
SELinux:最隐蔽的那个坑
文件在、权限也对(属主 nginx:nginx),Nginx 却读不到。真相在 SELinux 标签:
getenforce
sudo ls -lZ /data/static
目录标签是 default_t,而 Nginx 进程是 httpd_t,它默认读不了 default_t 的东西。两步走:
sudo semanage fcontext -a -t httpd_sys_content_t "/data/static(/.*)?"
sudo restorecon -Rv /data/static
sudo setenforce 1
标签改对之后,SELinux 就不是障碍了。
我自己挖的坑:/81 还是 :81
SELinux 修好,刷新还是 404。看 sudo tail -f /var/log/nginx/error.log,发现 Nginx 在找 /usr/share/nginx/html/favicon.ico——根本没用我配的 /data/static。再一看访问来源,我浏览器里输的是 http://IP/81(斜杠)而不是 http://IP:81(冒号)。斜杠被当成了路径,请求落到了默认 server 块(root 是 /usr/share/nginx/html),自然 404。改成冒号之后,/data/static/index.html 一下子就出来了。
顺手记的几个反向代理 502
后来拿 Nginx 做反向代理又碰了一圈 502,原因各不相同:后端没启动、location /api/ 少了个空格没生效、还有 SELinux 不让 Nginx 对外连网(要开 httpd_can_network_connect)。排反向代理除了看配置,记得 setsebool -P httpd_can_network_connect on 这一条很容易漏。
排错清单
| 现象 | 根因 | 解决 |
| 启动报 Job for nginx failed | 配置语法错(多了 }) | nginx -t 看行号 |
| 81 端口还是默认页 | default server 抢流量 | 禁掉 default.conf |
| :81 连不上 | 防火墙没放行 | firewall-cmd –add-port |
| 文件在却 404 | SELinux 标签不对 | semanage fcontext + restorecon |
| 访问 /81 报 404 | 把路径当端口(斜杠) | 用 :81 |
| 反代 502 | 后端没起 / SELinux 禁连网 | 起后端 / setsebool httpd_can_network_connect |
整个流程串下来就是:装 Nginx → 写 /etc/nginx/conf.d/static.conf → 建 /data/static/index.html → 修文件权限 → 修 SELinux 标签 → 防火墙放行端口。这几步顺序错了,哪个都可能卡你一下。