轮询策略本身不重试,必须通过 proxy_next_upstream、proxy_next_upstream_tries 和 proxy_next_upstream_timeout 三项参数协同配置,并配合 connect/read 超时与健康检查(max_fails/fail_timeout),且指令须置于 location 块内,才能实现有效重试与故障隔离。

轮询策略本身不重试,必须靠 proxy_next_upstream_tries 显式限制最大重试次数,配合超时与错误判定才能真正避免单点失败导致请求中断。
必须启用的重试基础配置
只设重试次数不够,三项参数需同时存在:
-
proxy_next_upstream:明确触发重试的条件,例如
error timeout http_500 http_502 http_503 http_504 -
proxy_next_upstream_tries:控制最多尝试几次(含首次),建议设为
3或5,防止无限循环 -
proxy_next_upstream_timeout:限定整个重试过程总耗时,如
10s,超时即返回错误,不等最后一次尝试完成
配套的超时与健康检查不能少
重试是否有效,取决于能否快速识别并跳过问题节点:
-
proxy_connect_timeout 控制建连上限(建议
3s–5s),避免卡在不可达机器上 -
proxy_read_timeout 限制等待响应时间(建议
10s),防止长尾拖慢整体 - 每个
server行后加上max_fails=3 fail_timeout=30s,让 Nginx 主动标记并暂离故障节点
配置位置和常见陷阱
这些指令必须放在 location 块内,不是 upstream 块里:
-
proxy_next_upstream、proxy_next_upstream_tries等只在location或server中生效 - 漏写
proxy_http_version 1.1和proxy_set_header Connection '',会导致每次重试都新建连接,放大延迟 - 若 upstream 中混用了
ip_hash或least_conn,轮询逻辑已失效,重试行为可能不按预期执行
验证重试是否真正起作用
别只看配置文件,要通过实际行为确认:
- 停掉一台后端,连续发 5 次请求,全部应返回
200,且$upstream_addr日志中不出现已下线的 IP - 让某台后端固定返回
502,观察 access log 中该请求只记录一次,说明重试在服务端内部完成 - error log 中出现
upstream retries或no live upstreams提示,代表机制正在工作而非静默失败


















