max_fails和fail_timeout是协同工作的故障响应开关:前者决定“多快下线”,后者决定“下线多久”,必须按业务类型匹配设置,否则易误杀健康节点或放任异常节点;需配合proxy_next_upstream显式启用状态码计数,并注意fail_timeout兼具统计窗口与禁用时长双重含义。

max_fails 和 fail_timeout 不是独立调优的两个数字,而是一对协同工作的“故障响应开关”:前者决定“多快下线”,后者决定“下线多久”,两者必须按业务特征匹配设置,否则容易误杀健康节点或放任异常节点持续承接流量。
区分业务类型设定组合值
不同服务对失败的容忍度和响应节奏差异很大,不能统一用 3/30s:
-
高敏感低频接口(如支付回调、风控校验):设为 max_fails=1 fail_timeout=10s。首次 502 或超时即隔离,避免错误状态扩散;但需确保后端有重试兜底,且配合
proxy_next_upstream http_502 timeout显式启用状态码计数。 - 常规 Web API(如用户查询、订单列表):推荐 max_fails=3 fail_timeout=30s。能过滤偶发抖动(如 GC 暂停、瞬时网络延迟),又不至于让故障节点长时间残留。
- 慢响应服务(如报表导出、大文件生成):设为 max_fails=2 fail_timeout=60s 或 90s。防止单次耗时 45s 的请求被误判为失败,拉高失败密度;同时保持较低 max_fails,因这类服务本不该频繁出错。
- 高并发场景(QPS 万级+):建议 max_fails=15~20 fail_timeout=10s。提升容错阈值,避免因单位时间失败绝对次数高导致节点反复进出 down 状态,引发请求毛刺。
必须启用 proxy_next_upstream 才生效
max_fails 默认只统计连接拒绝、连接超时两类错误;5xx 响应默认不计入失败计数——这意味着即使后端持续返回 502,节点也不会被摘除。
务必在 location 块中显式配置:
-
proxy_next_upstream error timeout http_500 http_502 http_503 http_504—— 明确哪些错误触发重试与失败计数 -
proxy_next_upstream_tries 3—— 最多重试 2 个其他节点(共最多发 3 次请求) -
proxy_next_upstream_timeout 10s—— 整个重试过程总耗时上限,不是单次超时
注意 fail_timeout 的双重含义
它既是“失败统计窗口”,也是“节点禁用时长”:
- 在
fail_timeout时间内,连续失败达max_fails次,节点即被标记为不可用 - 该节点随后会被跳过
fail_timeout秒,在此期间所有新请求都不会打过去 - 到期后,Nginx 会用第一个新请求试探性恢复——若成功则重新纳入轮询;若失败则重置计数并再次禁用
- 切勿设
fail_timeout=0,这会完全关闭被动健康检查机制
避开常见配置陷阱
几个高频误配点直接影响稳定性:
- 不要设 max_fails=0:等价于禁用失败计数,故障节点永不剔除
- 避免 max_fails 过大 + fail_timeout 过长:例如 15/60s,意味着节点可能在 1 分钟内累计失败 15 次才下线,大量用户已感知异常
-
不要忽略 slow services 的 read timeout:若
proxy_read_timeout小于业务实际耗时,请求未等响应就被中断,反向加剧失败计数 - 小流量接口慎用高 max_fails:低频下一次失败就足够预警,设成 3 可能错过关键信号











