Nginx 实现无缝重试需协同三方面:精准失败判定、可控重试行为、合理超时配合;配置 proxy_next_upstream 触发重试,收紧超时与重试次数,并结合 max_fails/fail_timeout 管理节点状态。

要让 Nginx 在后端节点宕机时实现无缝重试,关键不是“掩盖失败”,而是让单次请求在毫秒级内自动流转到健康节点,用户无感知。这需要三方面协同:精准的失败判定、可控的重试行为、以及合理的超时配合。
配置 proxy_next_upstream 触发重试
这是重试机制的开关,决定什么情况下放弃当前节点、转向下一个:
-
必须显式启用:在 location 块中添加
proxy_next_upstream error timeout http_502 http_503 http_504; - error 指连接被拒绝(如后端进程已退出)、timeout 指连接或读取超时
- HTTP 状态码(如 502/503)只有在
proxy_intercept_errors on;启用后才生效,否则直接返回给客户端 - 不要加
http_500,除非业务明确将 500 视为可重试错误;避免把业务逻辑错误误判为节点故障
收紧超时与限制重试次数
防止请求卡死或无限轮询,确保重试是快速、有限、有边界的:
-
proxy_connect_timeout 1s;:连接建立超过 1 秒即失败,不等 TCP 重传耗时 -
proxy_read_timeout 3s;:只等响应头,不是整个响应体;适合 API 类短请求 -
proxy_next_upstream_tries 2;:最多尝试 2 个节点(含首次),避免雪崩式扩散 - 若 upstream 有 3 台主节点,该配置意味着:首节点失败 → 重试第二台 → 第二台也失败 → 返回错误(不继续第三台)
结合 max_fails / fail_timeout 控制节点生命周期
让 Nginx 主动“记住”哪些节点暂时不可用,避免反复试探已知故障点:
- 在 upstream 的 server 行中设置:
server 192.168.1.10:8000 max_fails=2 fail_timeout=5s; - 含义:5 秒内连续失败 2 次,就标记该节点为不可用,5 秒内不再转发任何请求过去
- fail_timeout 过期后,首个请求会试探性发起;成功则恢复,失败则重新计时
- 这个机制和 proxy_next_upstream 是互补的:后者管“单次请求怎么流转”,前者管“节点状态怎么维护”
验证是否真正无缝
真实场景下测试比配置更重要:
- 停掉一台后端服务,用
curl -w "@format.txt" -o /dev/null -s http://your-domain/api/test查看响应时间与状态码 - 理想结果:平均耗时增加约 1–2 秒(一次失败 + 一次成功),始终返回 200,且 access log 中只有一条记录(说明未向宕机节点重复发请求)
- 检查 error log,确认出现
upstream timed out或connection refused,但没有大量no live upstreams报错


















