概述
504 表示某个代理在后端返回之前停止了等待。典型链路中,客户端、云负载均衡器、Ingress 控制器、服务网格和应用各自有超时。只提高 Ingress 超时,故障会转移到下一个更短的环节。修改前应梳理整条链路的超时,并让最外层最大。
步骤
- 只给慢路由添加注解,连接超时保持较短:
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "5"
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
nginx.ingress.kubernetes.io/proxy-send-timeout: "120"
- 确认生成的配置包含覆盖值:
kubectl exec deploy/ingress-nginx-controller -n ingress-nginx -- \
grep -A 6 'location /reports/export' /etc/nginx/nginx.conf
- 用
hey -n 5 -c 1 -t 180 https://api.example.com/reports/export压测慢接口。 - 检查服务或云负载均衡器的空闲超时,确保不低于 Ingress 的读取超时。
验证
预期五个请求全部返回 200,耗时约 90 秒;其他路由仍在 60 秒内超时,说明覆盖只作用于目标路径。若仍在 60 秒返回 504,说明链路上还有更短的超时,需要逐跳排查。
注意事项
- 长超时会占用 Ingress worker 连接,降低整体容量,不应全站放开。
- 读写超时分别覆盖上游读取与写入,流式响应长时间无数据也会触发读超时。
- 注解写错会被静默忽略并回落到默认值,修改后必须检查生成配置。
- 超过一两分钟的任务应改为异步作业加轮询,避免客户端断开和发布重启导致失败。