Nginx 502/504 常见原因与排查顺序

Cold 发布于 2019-10-15 18 次阅读 333 字 预计阅读时间: 2 分钟 Linux服务器


Nginx 报 502 和 504 都是网关错误,但原因不同:502 是 upstream 返回了无效响应或连不上,504 是 upstream 超时没响应。

先看 Nginx 错误日志

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

常见的几类:

  • connect() failed (111: Connection refused):后端没起来,或端口不对
  • connect() to unix socket failed (11: Resource temporarily unavailable):FPM 进程满
  • upstream timed out (110: Connection timed out):后端处理太慢
  • no live upstreams:所有后端都被健康检查摘了

排查顺序

  1. 后端服务活着吗?systemctl status php-fpm / ps aux | grep java
  2. 端口通吗?telnet 127.0.0.1 9000 或 curl localhost:8080
  3. 后端日志有没有报错?PHP 看 php-fpm.log,Java 看应用日志
  4. 是不是慢请求堆积?看 FPM slow log 或应用线程池
  5. Nginx 超时配置是否合理?proxy_read_timeout、fastcgi_read_timeout

504 的处理

如果是偶发慢请求,调大超时只能缓解。根治要优化后端:加缓存、异步化、拆分慢接口。把 proxy_read_timeout 从 60s 调到 300s 只是让用户多等 4 分钟,体验更差。

502 的处理

如果是 FPM 进程满,参考上一篇调 pm.max_children,同时排查慢脚本。如果是后端挂了,先恢复服务,再看崩溃原因。

记住:Nginx 只是转发,502/504 的根因基本都在后端。

和喜欢的一切在一起~
最后更新于 2019-10-15