nginx网关504超时是proxy_*_timeout与upstream协同失效所致,需明确各阶段超时职责:proxy_connect_timeout控连接、proxy_send_timeout控发送、proxy_read_timeout控响应等待,proxy_next_upstream_timeout为总时限;upstream须配置多节点、max_fails熔断及proxy_next_upstream失败识别;重试需设tries与timeout防雪崩,慎用non_idempotent;配合cache_stale与error_page实现柔性降级。

Nginx 代理超时引发的网关超时(504)不是单点参数问题,而是 proxy_*_timeout 与 upstream 行为协同失效的结果。关键在于让超时可感知、重试有边界、失败能摘除、兜底有路径。
明确各阶段超时职责,避免叠加等待
-
proxy_connect_timeout控制 TCP 连接建立上限:内网设 3–5s,跨机房或 HTTPS 后端建议 5–10s;超时直接返回 502,日志提示Connection timed out while connecting to upstream -
proxy_send_timeout管控请求体发送完成时限:上传大文件或长 body 时设 30–300s;超时即断连,不触发重试 -
proxy_read_timeout决定“等响应”最长多久:普通接口设 60s,报表/AI 类任务可设 120–300s;它才是触发timeout类重试的开关 -
proxy_next_upstream_timeout是总闸门:从首次发请求起计时,所有重试尝试(含切换节点、重连、再读)累计不能超此值;设为proxy_read_timeout × tries × 1.3较稳妥,比如read=10s, tries=3→ 建议设30–40s
upstream 必须支撑重试逻辑,否则 timeout 形同虚设
- 至少定义 2 台 server,例如:
upstream backend { server 10.0.1.10:8080 max_fails=1 fail_timeout=5s; server 10.0.1.11:8080 max_fails=1 fail_timeout=5s; } -
max_fails=1 fail_timeout=5s实现秒级熔断:一次失败即摘除,5 秒后首个请求自动试探恢复 - 必须在 location 中启用对应失败识别:
proxy_next_upstream error timeout http_502 http_503 http_504;
否则后端返回 502/504 不计入失败,节点持续转发,重试机制瘫痪
用重试控制防雪崩,不是越多越好
-
proxy_next_upstream_tries 3;表示最多发起 3 次请求(含首次),不是“额外重试 2 次” -
proxy_next_upstream_timeout 30s;配合上条,确保即使三台都慢,用户也只等最多 30 秒就收到 502,而非 3×10s=30s 串行卡死 - 慎用
non_idempotent:POST/PUT 默认不重试,加该指令会突破幂等性约束,仅限确认后端已做幂等处理时使用
超时故障要能柔性降级,不止于报错
- 当 upstream 全挂或缓存陈旧,可联动
proxy_cache_use_stale返回过期缓存并后台刷新:proxy_cache_use_stale error timeout updating http_502 http_503 http_504;
- 缓存失效且 upstream 无可用节点时,由
error_page 502 503 504 = @degrade;跳转至静态页或兜底服务,避免裸错暴露给用户
不复杂但容易忽略











