Nginx轮询本身不处理超时重试,需配置proxy_next_upstream timeout等参数实现超时后重试其他后端;重试逻辑独立于轮询顺序,从健康节点中重新选取,非简单顺延。

在 Nginx 的 upstream 轮询(round-robin)策略中,**Nginx 本身不支持“请求超时后自动切换到下一个上游服务器”这种动态重试逻辑**。它默认只在连接建立失败、连接被拒绝、或配置了 proxy_next_upstream 且满足特定错误条件时,才会尝试下一个 upstream server。
但你可以通过合理组合以下配置项,**实现“请求超时后主动重试另一台后端”的效果**——这本质上是启用容错重试机制,而非轮询算法本身的切换逻辑。
1. 启用 proxy_next_upstream 并指定超时触发重试
这是最关键的配置。默认情况下,Nginx 不会因 proxy_read_timeout 或 proxy_connect_timeout 超时而重试;必须显式声明超时属于可重试错误:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;- 其中
timeout表示:当与 upstream 建立连接(proxy_connect_timeout)或等待响应头(proxy_read_timeout)超时时,允许重试下一台服务器。
2. 设置合理的超时时间与重试次数
避免无限重试或过长等待,需配合控制:
-
proxy_connect_timeout 5s;—— 连接后端的超时(建议 3–10s) -
proxy_send_timeout 30s;—— 发送请求体给后端的超时(一般不用调) -
proxy_read_timeout 30s;—— 等待后端返回响应头/数据的超时(关键!设为业务可接受的最大单次等待时间) -
proxy_next_upstream_tries 3;—— 最多重试 2 次(即最多尝试 3 台服务器,含首次) -
proxy_next_upstream_timeout 60s;—— 整个重试过程总耗时上限(防止串行卡死)
3. 确保 upstream 使用标准轮询且无干扰配置
保持简单轮询,避免干扰重试行为:
- 不要加
weight、max_fails、fail_timeout等(除非你明确需要健康检查),否则可能让某台 server 被临时标记为不可用,跳过重试。 - 基础写法示例:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
4. 验证是否生效(常见误区提醒)
注意:超时重试仅发生在「已选中某台 server 后发生 timeout」时,不是每次请求都轮询+超时再换。例如:
- 第 1 次请求 → 选 server A → A 响应慢超时 → 触发重试 → 选 server B(按轮询顺序的下一台,或可用池中下一台)→ 返回结果
- 第 2 次请求 → 仍按轮询顺序选 server B(除非你配了
ip_hash或其它负载算法) - 若未配置
proxy_next_upstream timeout,即使 A 超时,Nginx 也会直接返回 504,不会换机器
不复杂但容易忽略:只要把 timeout 明确写进 proxy_next_upstream,并配好对应超时参数,Nginx 就会在超时场景下自动走重试流程,达到你想要的“超时切换”效果。


















