max_fails是fail_timeout时间窗口内触发节点临时摘除的阈值,需与proxy_next_upstream配合识别5xx等失败,按业务类型差异化配置:高敏感接口设1/10s,常规API设2–3/30s,慢服务设2/60s,高并发场景可调至20/10s。

要让 max_fails 真正发挥“自动下线触发阈值”的作用,关键不是单独调大或调小这个数字,而是把它和 fail_timeout 绑定成一个动态观察窗口,并确保 Nginx 能准确识别哪些失败该算数。
max_fails 不是失败计数器,而是时间窗口内的触发开关
它只在 最近 fail_timeout 秒内 的失败次数达到设定值时才生效。比如设为 max_fails=3 fail_timeout=30s,意思是:任意连续 30 秒里,只要发生 3 次符合条件的失败,节点立刻被标记为不可用,且接下来 30 秒内完全不发请求过去。窗口是滚动的,不是从零开始重置。
- 失败类型默认只包括连接拒绝(connection refused)和连接超时(timeout)
- 5xx 响应(如 502/503)默认不计入——必须配合
proxy_next_upstream显式启用 - 设
max_fails=0会直接禁用被动健康检查,节点挂了也不会被感知
按业务响应特征匹配组合值
没有通用最优值,只有贴合你后端行为的组合:
-
缓存类服务(Redis/Memcached):延迟低、失败即真故障 →
max_fails=2 fail_timeout=10s -
常规 Web API(QPS 数百~数千):兼顾抖动过滤与故障响应 →
max_fails=3 fail_timeout=30s -
高并发网关(QPS 万级+):避免毛刺反复触发 →
max_fails=15–20 fail_timeout=10s -
慢响应服务(报表导出、大文件):防止单次长耗时误判 →
max_fails=2 fail_timeout=60s -
高敏感低频接口(支付回调、风控通知):单次失败就隔离 →
max_fails=1 fail_timeout=10s,但需后端有重试兜底
必须配套的关键配置
只改 upstream 里的 max_fails 和 fail_timeout 是不够的,以下三项缺一不可:
- 在
location块中启用失败判定:proxy_next_upstream error timeout http_500 http_502 http_503 http_504 - 控制重试边界:
proxy_next_upstream_tries 2(最多换一次节点)、proxy_next_upstream_timeout 5s(整个重试流程限时) - 确保
proxy_read_timeout小于fail_timeout,否则请求未等完就被中断,人为拉高失败率
验证是否真正生效的小方法
修改配置 reload 后,可人工模拟一次明确失败(例如临时让后端返回固定 502),然后观察:
- 连续发 2–3 次请求,看 access log 中目标节点 IP 是否不再出现
- 等待
fail_timeout秒后发第 4 次,看该节点是否重新出现在日志中(说明试探恢复已启动) - 注意:恢复动作发生在“首个新请求到达时”,不是定时执行,低流量环境可能感知延迟


















