当Nginx返回502 Bad Gateway错误时,通常表示Nginx作为反向代理无法从上游服务器(如应用服务器、PHP-FPM、Node.js、Tomcat等)获取有效响应。以下是系统的排查和解决步骤:
1. 确认上游服务状态
-
检查服务是否运行:
# 查看应用服务器进程(以PHP-FPM为例) systemctl status php-fpm ps aux | grep php-fpm
- 如果服务未运行,重启服务:
systemctl restart php-fpm
- 如果服务未运行,重启服务:
-
验证端口监听:
netstat -tuln | grep <端口号> # 如3306、9000 ss -tuln | grep <端口号>
2. 检查Nginx配置
-
确认
proxy_pass
指向正确:location / { proxy_pass http://backend_server; # 检查IP、端口是否正确 proxy_set_header Host $host; }
- 确保
backend_server
在upstream
块中正确定义:upstream backend_server { server 192.168.1.100:8080; # 检查后端地址 }
- 确保
-
检查超时配置:
proxy_connect_timeout 60s; # 连接上游超时时间 proxy_read_timeout 60s; # 读取响应超时时间 proxy_send_timeout 60s; # 发送请求超时时间
3. 分析Nginx错误日志
- 查看错误日志:
tail -f /var/log/nginx/error.log
- 常见日志线索:
*111 connect() failed (111: Connection refused)
:上游服务未启动或端口未监听。*110 Connection timed out
:网络不通或上游服务响应慢。*104 upstream prematurely closed connection
:上游服务主动断开连接。
- 常见日志线索:
4. 检查网络连通性
- 测试上游服务器可达性:
telnet <上游IP> <端口> # 检查端口是否开放 curl -v http://上游IP:端口 # 模拟Nginx请求
- 如果连接失败,排查:
- 防火墙规则(
iptables
、firewalld
)。 - 安全组策略(云服务器控制台)。
- 网络路由问题。
- 防火墙规则(
- 如果连接失败,排查:
5. 排查上游服务问题
PHP-FPM 常见问题
- 进程池耗尽:
- 调整
pm.max_children
(php-fpm.conf
):pm.max_children = 50 pm.start_servers = 10
- 查看FPM状态:
systemctl status php-fpm tail -f /var/log/php-fpm/error.log
- 调整
Node.js/Python应用问题
- 应用崩溃或阻塞:
- 检查应用日志(如
/var/log/nodejs/app.log
)。 - 使用
strace
跟踪进程:strace -p <应用进程PID>
- 检查应用日志(如
6. 资源不足问题
- 检查服务器资源:
top # 查看CPU、内存占用 free -h # 内存使用情况 df -h # 磁盘空间 dmesg | grep oom # OOM(内存溢出)记录
- 如果资源耗尽:
- 升级服务器配置。
- 优化应用代码或数据库查询。
- 如果资源耗尽:
7. 临时解决方案
- 重启服务:
systemctl restart nginx systemctl restart php-fpm
- 降级或回滚:
- 如果最近更新了配置或代码,尝试回滚到稳定版本。
8. 高级排查工具
-
抓包分析:
tcpdump -i eth0 port <上游端口> -w capture.pcap
- 使用Wireshark分析
capture.pcap
,检查TCP握手是否成功。
- 使用Wireshark分析
-
压力测试:
ab -n 1000 -c 100 http://your-domain.com/
总结
502错误的根源通常是:
- 上游服务未运行或配置错误。
- 网络不通(防火墙、端口、路由)。
- 资源耗尽(CPU、内存、连接数)。
- 超时配置不合理。
- 应用代码异常(崩溃、死锁)。