Nginx 出现 502 Bad Gateway 通常意味着反向代理无法从上游服务器获取有效响应,排查时应优先确认后端服务存活状态及网络连通性。
先说结论:502 错误本质是 Nginx 作为反向代理无法从后端获取有效响应,优先排查后端进程是否存活及网络是否可达。
- 先确认:后端服务进程是否运行且监听正确端口
- 先处理:查看 Nginx 错误日志定位具体连接失败原因
- 再验证:修复后通过 curl 或浏览器确认状态码回归 200
负载均衡 upstream 配置示例
标题强调负载均衡,若配置了多节点 upstream,需检查 upstream 块配置是否正确。以下是一个典型的多后端配置示例,包含被动健康检查参数:
upstream backend_pool {
# 被动健康检查:3 次失败后标记不可用,30 秒后尝试恢复
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend_pool;
# 连接超时设置
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}注意:开源版 Nginx 默认仅支持被动健康检查(请求失败才标记),主动健康检查通常需要第三方模块或 Nginx Plus。
502 错误核心排查步骤
按照以下顺序逐步排查,每完成一步都观察日志变化,常用命令已整合至步骤中:
1. 查看 Nginx 错误日志
这是最关键的一步。打开 /var/log/nginx/error.log,查找最近的 502 记录。常见报错信息包括 connect() failed(连接被拒绝)或 upstream timed out(响应超时)。
tail -f /var/log/nginx/error.log2. 确认后端服务状态
登录到后端服务器或本机,检查应用进程是否在运行。如果进程挂掉,Nginx 自然无法连接。
# 检查后端服务进程状态(以 PHP-FPM 或 Java 为例)
systemctl status php-fpm
# 检查后端端口监听情况
ss -tnp | grep 80803. 测试网络连通性
在 Nginx 所在的服务器上,测试能否打通后端 IP 和端口。如果这里不通,检查防火墙或安全组规则。
# 从 Nginx 服务器内部测试后端连通性
curl -v http://127.0.0.1:8080
# 或检查 Nginx 配置语法
nginx -t4. 验证修复结果
完成修复后,使用 curl -I http://你的域名 查看返回的 HTTP 状态码,确认是否为 200 OK。同时观察 Nginx 访问日志(access.log),确认状态码字段不再是 502。
常见坑与注意事项
1. 后端只监听了 127.0.0.1:如果 Nginx 配置的上游地址是局域网 IP,而后端只绑定本地回环地址,会导致连接被拒绝。
2. SELinux 拦截:在开启 SELinux 的 CentOS/RHEL 系统中,SELinux 策略可能禁止 Nginx 发起网络连接。如果日志提示 Permission denied,可尝试临时设置 setsebool -P httpd_can_network_connect 1 测试。
3. 超时时间过短:默认超时时间对于某些复杂查询可能不够,但不要无限制调大,否则会导致请求堆积。
4. 防火墙规则变更:有时后端服务重启后防火墙规则未持久化,或云服务商安全组规则被意外修改。
参考来源
- Nginx Official Documentation, "ngx_http_proxy_module", https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- Nginx Official Documentation, "HTTP request processing", https://nginx.org/en/docs/http/ngx_http_core_module.html