如何修复Nginx 502 Bad Gateway错误?上游连接被拒问题求助
解决Nginx 502 Bad Gateway错误:连接上游服务被拒绝
兄弟,先看你的错误日志里的核心信息:
2018/03/26 10:13:12 [error] 9456#9456: *2580202 connect() failed (111: Connection refused) while connecting to upstream, client: 180.97.106.39, server: _, request: "GET /?season=1&league_id=1'%20AND%20(SELECT%20*%20FROM%20(SELECT(SLEEP(5)))oU...
这里的connect() failed (111: Connection refused)是关键——Nginx作为反向代理,没法把请求转发到你的后端业务服务(比如Node、PHP-FPM、Python服务这些),所以返回了502。下面是最常见的排查和修复步骤:
1. 先确认后端服务还活着吗?
Nginx本身不处理业务,全靠后端服务干活。先检查你的后端进程是不是挂了:
- 如果用systemd管理服务(比如Node、Django服务),直接跑
systemctl status 你的服务名(比如systemctl status nodejs),看状态是不是active (running) - 也可以用
ps aux | grep 你的服务进程名(比如ps aux | grep node),看看进程列表里有没有它 - 如果服务没运行,赶紧启动:
systemctl start 你的服务名,顺便设置开机自启避免下次再挂:systemctl enable 你的服务名
2. 核对后端服务的监听地址和端口
Nginx配置里的proxy_pass或者upstream块指定了后端的地址和端口,比如你可能配置了proxy_pass http://localhost:3000;。这时候要确认:
- 后端服务确实在监听这个端口:跑
netstat -tulpn | grep LISTEN,找对应的端口(比如3000)是不是在监听列表里 - 监听地址要对:如果后端只监听
127.0.0.1,那只有本地能访问;如果Nginx和后端不在同一台机器,要确保后端监听的是可被Nginx访问的IP(比如0.0.0.0或者对应内网IP) - 如果端口或者地址不对,要么改Nginx配置,要么改后端服务的监听设置,改完重启Nginx:
sudo systemctl restart nginx
3. 检查防火墙有没有拦着
有时候本地防火墙会搞事情,即使是同一台机器上的Nginx和后端服务,也可能被防火墙拦截通信:
- 用
sudo ufw status(UFW防火墙)或者sudo firewall-cmd --list-all(Firewalld)查看当前规则 - 如果发现后端端口没被允许,添加规则:比如
sudo ufw allow 3000/tcp(假设后端用3000端口) - 重启防火墙生效:
sudo ufw reload或者sudo firewall-cmd --reload
额外提一句:日志里的恶意请求
你日志里的请求带了AND (SELECT * FROM (SELECT(SLEEP(5)))oU...,这明显是自动化的SQL注入扫描。虽然这不是这次502的原因,但后续得注意防护:
- 后端服务一定要做输入验证和参数过滤,别给SQL注入留机会
- 可以在Nginx里加简单的WAF规则,或者用fail2ban拦截这类恶意IP的请求
先从上面前三点排查,90%的这类502问题都是后端服务挂了或者端口/地址不对导致的。
内容的提问来源于stack exchange,提问作者SoftTimur




