selinux 阻止 nginx 反向代理连接后端时,典型表现为 502 bad gateway 或错误日志中出现 “connect() failed (13: permission denied) while connecting to upstream”;可通过临时禁用 selinux(setenforce 0)验证,再用 ausearch 或 audit.log 查找 avc denied 记录,最终启用 setsebool -p httpd_can_network_connect 1 永久解决。

SELinux 阻止 Nginx 反向代理连接后端,最典型的表现是 502 Bad Gateway 或错误日志中出现 connect() failed (13: Permission denied) while connecting to upstream。这不是配置写错了,而是 SELinux 的安全策略在起作用——Nginx(运行在 httpd_t 域)默认被禁止主动发起网络连接。
确认是否为 SELinux 导致的问题
先快速验证是不是 SELinux 在拦截:
- 临时切换到宽容模式:
sudo setenforce 0 - 重启 Nginx:
sudo systemctl restart nginx - 用
curl测试反向代理接口(如curl http://localhost/api) - 如果此时正常返回,基本可确定是 SELinux 拦截;测试完记得恢复:
sudo setenforce 1
查看 SELinux 拒绝记录
直接查审计日志,定位被拦的具体行为:
- 用
ausearch过滤最近的 Nginx 相关拒绝事件:sudo ausearch -m avc -ts recent | grep nginx - 或查完整日志:
sudo grep nginx /var/log/audit/audit.log | grep denied - 典型输出会包含
avc: denied { name_connect }和目标端口(如dest=8080),以及源/目标上下文(如scontext=system_u:system_r:httpd_t:s0)
启用必要布尔值(推荐方案)
Nginx 反向代理需主动连后端服务,必须开启对应网络连接权限:
- 执行:
sudo setsebool -P httpd_can_network_connect on -
-P表示永久生效,重启不丢失 - 该布尔值专为 Web 服务(含 Nginx)设计,允许其建立出站 TCP 连接,安全边界清晰
- 验证是否生效:
getsebool httpd_can_network_connect应返回on
补充:若使用非标准端口还需放行端口类型
比如后端监听在 48081,而该端口未被标记为允许 Web 服务使用的类型:
- 先检查当前
http_port_t允许哪些端口:semanage port -l | grep http_port_t - 把端口加入该类型:
sudo semanage port -a -t http_port_t -p tcp 48081 - 如提示
semanage未安装,先运行:sudo yum install -y policycoreutils-python











