max_fails是fail_timeout滑动窗口内累计失败阈值,用于标记节点不可用而非控制重试次数;必须与fail_timeout、proxy_next_upstream协同配置,否则健康检查失效。

在 Nginx 的负载均衡配置中,max_fails 并不是设置“后端重试次数”的阈值,而是定义某个 upstream server 在指定时间窗口内连续失败多少次后,被标记为不可用(即进入 fail timeout 期)。
max_fails 控制的是“失效判定”,不是“重试次数”
Nginx 默认对 upstream server 的健康检查基于请求响应结果:当一个请求返回错误状态码(如 500、502、503、504)或连接超时/拒绝时,记为一次失败。若该 server 在 fail_timeout 时间内连续失败达到 max_fails 次,Nginx 就会将其暂时剔除出可用列表,不再转发请求,直到 fail_timeout 过期后才重新尝试连接。
-
max_fails=3表示:3 秒(默认fail_timeout)内连续失败 3 次 → 标记为 down - 它不控制客户端请求被重试几次,也不影响单个请求的重发逻辑
- 单个请求失败后是否重试,由
proxy_next_upstream和proxy_next_upstream_tries决定
真正控制重试行为的是 proxy_next_upstream 相关指令
若想让 Nginx 在某台后端失败时自动换一台重试,需显式启用并配置重试策略:
-
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;—— 定义哪些条件触发重试 -
proxy_next_upstream_tries 3;—— 最多重试 2 次(即最多共尝试 3 台 server,含首次) -
proxy_next_upstream_timeout 10s;—— 所有重试总耗时上限(可选)
注意:proxy_next_upstream_tries 是针对单个客户端请求的总尝试次数(包括第一次),不是 per-server 的重试数。
max_fails 和 fail_timeout 需配合使用才有效
max_fails 单独存在无意义,必须和 fail_timeout 联用才能定义“多久内失败几次就下线”。常见写法:
server 192.168.1.10:8080 max_fails=2 fail_timeout=30s;- 表示:30 秒内连续失败 2 次 → 此 server 被标记为不可用,30 秒内不再分发请求
- 若设
max_fails=0,则禁用主动健康检查(仍可能因连接失败被动剔除)
实际部署建议
避免过度敏感或过于迟钝:
- 流量低、后端稳定性差时,可设
max_fails=1 fail_timeout=10s快速隔离异常节点 - 高并发场景建议
max_fails=3 fail_timeout=60s,防止偶发超时误判 - 务必配合
proxy_next_upstream开启合理错误码重试,否则即使有备用 server,失败请求也会直接返回给用户 - 可通过
nginx -T | grep -A 5 "upstream"检查配置是否生效,用curl -I观察响应头中的X-Upstream-Addr(需自定义日志或响应头)验证轮转与故障转移











