记录一下部署服务出现502 Bad Gateway的问题
环境
服务A:部署2个后端Java项目(Springboot)等

服务B:部署前端项目,客户端和后台管理两个前端项目
nginx部署在服务B中

nginx配置文件如下:

从nginx的配置可以看到,访问http://admin.lease.atguigu.com/admin/*等路径应该代理到http:/192.168.10.110:8080
问题出现

本该代理的http://admin.lease.atguigu.com/admin/*路径出现了502 Bad Gateway
排查


网络,端口,还有使用curl命令调用都是通的,
防火墙也是关闭状态
依然还是502 Bad Gateway
纠结好久…
突然想到查看nginx代理的日志,发现nginx日志报错如下:
2025/11/15 00:03:15 [crit] 4248#4248: *135 connect() to 192.168.10.110:8080 failed (13: Permission denied) while connecting to upstream, client: 192.168.10.1, server: admin.lease.atguigu.com, request: “GET /admin/login/captcha HTTP/1.1”, upstream: “http://192.168.10.110:8080/admin/login/captcha”, host: “admin.lease.atguigu.com”, referrer: “http://admin.lease.atguigu.com/”
随即问了问AI,得到结果如下
这个错误是 Nginx 作为反向代理时,尝试连接上游服务器(192.168.10.110:8080)失败,具体原因是 “权限被拒绝(Permission denied)”,错误码 13(Linux 系统中错误码 13 通常对应权限相关问题)。
核心原因分析:
Nginx 进程在发起网络连接到上游服务器(192.168.10.110:8080)时,被系统的安全机制阻止,导致 “权限不足”。常见具体原因如下:
SELinux/AppArmor 等安全模块限制Linux 系统中的 SELinux(或 AppArmor)是强制访问控制模块,默认可能限制 Nginx 进程的网络连接权限。例如:
SELinux 默认策略中,httpd_t(Nginx 进程的安全上下文)可能不允许主动连接到其他服务器的端口(即httpd_can_network_connect策略未开启),导致连接被拦截。
可通过查看 SELinux 审计日志(/var/log/audit/audit.log)确认,通常会有类似 “type=AVC msg=… denied … httpd_t …” 的记录。
防火墙规则阻止出站连接Nginx 所在服务器的防火墙(如firewalld、iptables)可能配置了出站规则,禁止连接到192.168.10.110:8080。例如:
防火墙默认拒绝所有未明确允许的出站连接,而未添加允许访问192.168.10.110:8080的规则,导致连接被阻断。
Nginx 进程用户权限限制(较少见)Nginx 通常以非 root 用户(如nginx用户)运行,若该用户被特殊限制(如通过ulimit或其他安全工具禁止网络连接),也可能导致权限不足,但这种情况极少(网络连接权限通常是系统级控制,而非用户级)。
排查与解决建议:
检查 SELinux 配置
临时关闭 SELinux 测试:执行 setenforce 0(临时生效,重启失效),若错误消失,说明是 SELinux 导致。
永久解决:开启httpd_can_network_connect策略,执行 setsebool -P httpd_can_network_connect 1(-P表示永久生效)。
检查防火墙规则
若使用firewalld,添加允许连接192.168.10.110:8080的规则:
bash
firewall-cmd --add-rich-rule=‘rule family=“ipv4” destination address=“192.168.10.110” port port=“8080” protocol=“tcp” accept’ --permanent
firewall-cmd --reload
若使用iptables,添加规则:
bash
iptables -A OUTPUT -d 192.168.10.110 -p tcp --dport 8080 -j ACCEPT
service iptables save
确认上游服务器可达性在 Nginx 所在服务器执行 telnet 192.168.10.110 8080 或 curl http://192.168.10.110:8080,若同样提示 “Permission denied”,则进一步验证是本地安全策略问题;若提示 “Connection refused”,则可能是上游服务器未启动或端口未开放(需排查上游服务)。
总结:此错误核心是 Nginx 的网络连接被系统安全机制(SELinux / 防火墙)阻止,优先排查 SELinux 和防火墙配置即可解决。
#执行此命令
setsebool -P httpd_can_network_connect 1
重启访问,502 Bad Gateway解决。

4万+

被折叠的 条评论
为什么被折叠?



