504-gateway-timeout

504 Gateway Timeout 的定位与修复

现象

网关返回 504 Gateway Timeout,表示它已经连上上游,但在超时时间内没有拿到完整响应。和 502 不同,504 通常是后端太慢,而不是完全不可达。

快速定位

curl -v -w '\n total=%{time_total}\n' http://<gateway>/<path>
tail -f /var/log/nginx/error.log
grep -i 'upstream timed out' /var/log/nginx/error.log
journalctl -u <backend> --since '10 min ago'
ss -lntp | grep ':<backend-port>'

常见根因

  1. 后端查询慢:数据库慢查询、锁等待、外部 API 超时。
  2. 网关 proxy_read_timeout/proxy_connect_timeout 太短。
  3. 后端连接池、线程池或 worker 耗尽,请求排队。
  4. 大请求体、流式响应或长轮询被网关提前切断。
  5. 网络延迟、丢包或中间代理超时。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 收到 504 通常说明后端不可达还是后端太慢?
  2. 如何判断是后端真的慢,还是网关超时设置太短?
  3. 是否应该为了消除 504 无限调大网关超时?
答案
  1. 504 表示网关已经连上上游,但在超时时间内没有拿到完整响应。通常是后端太慢,而不是完全不可达。
  2. 用 curl 直连后端测耗时,再对比经过网关的耗时。同时看 proxy_read_timeout/proxy_connect_timeout。
  3. 不应该。页面强调不要为了掩盖慢查询无限调大。应先优化慢查询、异步化并扩容后端。