502 Bad Gateway 错误完全指南:从原理到排查解决

深夜网站突然报错 502,手忙脚乱找不到原因?这篇帮你彻底搞懂它。

什么是 502 Bad Gateway?

502 Bad Gateway 是 HTTP 协议中的一个状态码,表示网关或代理服务器收到了无效响应。

简单来说,就是:

你访问网站时,请求经过了一个"中间人"(网关/代理),但这个中间人去请求后端服务器时,后端返回了它无法理解或处理的东西。

典型场景

1
2
3
用户 → Nginx(网关) → 后端服务(API/应用服务器)

返回了 502 错误

502 的常见原因

1. 后端服务宕机

  • 应用服务器未启动
  • 进程崩溃退出
  • 端口未监听

2. 网关与服务通信失败

  • 后端响应超时
  • 网络断开
  • 防火墙拦截

3. 后端返回格式错误

  • 后端返回了无效的 HTTP 响应
  • 响应头或响应体格式异常

4. 资源耗尽

  • 后端服务内存/CPU 耗尽
  • 连接数达到上限

5. 配置错误

  • Nginx 配置的 proxy_pass 指向错误地址
  • 负载均衡配置不当

如何排查 502 错误?

步骤 1:检查后端服务状态

1
2
3
4
5
6
7
# 查看服务进程是否运行
ps aux | grep your-app

# 查看端口是否监听
netstat -tlnp | grep 8080
# 或
ss -tlnp | grep 8080

步骤 2:查看后端日志

1
2
3
4
5
# 应用日志
tail -f /var/log/your-app.log

# 系统日志
journalctl -u your-service -n 50

步骤 3:检查 Nginx 错误日志

1
tail -f /var/log/nginx/error.log

Nginx 的日志通常会明确指出是连接失败还是超时

步骤 4:测试后端服务直接访问

1
2
# 绕过 Nginx,直接访问后端
curl -v http://127.0.0.1:8080/health

如果这里也失败,说明问题在后端本身。

步骤 5:检查网络连通性

1
2
3
4
5
# 测试端口连通性
nc -zv 127.0.0.1 8080

# 或 telnet
telnet 127.0.0.1 8080

如何解决 502 错误?

原因 解决方案
服务未启动 启动服务:systemctl start your-app
进程崩溃 查看日志修复代码后重启
超时 调高 proxy_connect_timeout / proxy_read_timeout
资源不足 增加资源或优化代码
配置错误 检查 Nginx proxy_pass 配置

Nginx 超时配置参考

1
2
3
4
5
6
location / {
proxy_pass http://backend;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}

如何预防 502?

  1. 健康检查 + 自动重启

    • 使用 systemd 或 Docker 健康检查
    • 异常自动拉起
  2. 负载均衡

    • 多实例部署,Nginx upstream 轮询
  3. 监控告警

    • 接入 Prometheus + Grafana
    • 502 出现立即告警
  4. 优雅关闭

    • Nginx proxy_next_upstream 尝试其他后端
    • 后端服务优雅退出的配置

总结

502 本质上是 “网关后面的服务挂了” 的信号。排查思路:

  1. 先看后端服务是否活着
  2. 再看日志定位具体原因
  3. 最后针对性修复

希望这篇能帮你在遇到 502 时不再慌张!


有问题欢迎评论区交流~