nginx健康检查是被动式,依赖max_fails与fail_timeout协同实现容错;需配合proxy_next_upstream、重试限制及超时对齐等配置才能生效,且须按业务特征差异化调优。

Nginx 本身不支持主动探测式健康检查(如 HTTP GET 心跳),它的“健康检查”是被动的,靠的是请求失败后的统计与隔离机制。真正实现智能容错,关键在于合理配置 max_fails 和 fail_timeout,并让它们与业务节奏、错误类型、重试行为形成闭环。
max_fails 和 fail_timeout 是一对滑动窗口参数
这两个值必须一起看,不能单独调优:
-
fail_timeout既是失败统计的时间窗口长度,也是节点被标记为不可用后的隔离时长 -
max_fails是在这个窗口内累计失败达到多少次,就触发隔离
比如 max_fails=3 fail_timeout=30s 表示:
- 若某台后端在任意连续 30 秒内出现 3 次失败,立刻被跳过
- 跳过时长正好是 30 秒,到期后第一个新请求会尝试连它
- 若成功,失败计数清零,重新纳入轮询;若仍失败,再进下一轮 30 秒隔离
注意:失败不是“连续失败”,而是“窗口内累计失败”。中间哪怕有成功请求,只要没超时窗口,计数继续累加。
按业务特征选配组合
不同服务对错误的容忍度和响应耗时差异很大,统一用 3/30 容易出问题:
-
强一致性核心链路(如支付回调、风控同步)
-
max_fails=1 fail_timeout=5s - 单次失败即隔离,5 秒后试探恢复,防止错误状态扩散
- 要求后端自身有重试或幂等保障,否则可能丢请求
-
-
常规 Web/API 服务(QPS 数百~数千,平均响应 100–300ms)
-
max_fails=3 fail_timeout=30s - 可过滤 GC 暂停、瞬时网络抖动等偶发异常,是多数场景的稳健起点
-
-
高并发网关(QPS 万级+,节点少于 3 台)
-
max_fails=20 fail_timeout=10s - 缩短窗口 + 提高阈值,避免因个别慢请求反复误剔,防止流量雪崩挤压剩余节点
-
-
慢响应服务(报表导出、大文件上传、WebSocket 后端)
-
max_fails=2 fail_timeout=60s - 避免一次正常耗时 45s 的请求被前序 timeout 连带计入失败,导致健康节点被误摘
-
必须配套的关键配置
只改 max_fails 和 fail_timeout 不起作用,以下三项缺一不可:
-
启用 proxy_next_upstream 显式定义失败条件
在location块中写:proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
-
error:连接拒绝、连接中断等底层 I/O 错误 -
timeout:connect/read/send 超时 -
http_500–504:必须逐个列出,Nginx 默认不把 5xx 当失败计入max_fails - 别加
http_404或http_401:它们是业务正常态,加入会导致健康节点被误杀
-
-
限制重试范围与总耗时
proxy_next_upstream_tries 3; # 最多重试 2 个其他节点(共最多发 3 次请求) proxy_next_upstream_timeout 10s; # 整个重试链路总耗时上限,不是单次超时
防止单点故障引发全链路阻塞或雪崩
-
超时参数需对齐
proxy_read_timeout必须小于fail_timeout,例如:-
fail_timeout=30s→proxy_read_timeout建议设为20s或更短 - 否则请求卡在读阶段超时,无法及时触发失败计数,容错机制失效
-
常见误区提醒
-
max_fails=0等价于关闭失败计数,不建议生产使用 - 默认
max_fails=1 fail_timeout=10s过于敏感,小抖动就触发剔除,容易造成流量倾斜 - 所有
server行应保持一致的max_fails和fail_timeout值,否则轮询队列完整性会被破坏 -
backup节点不是健康检查的一部分,它是最后兜底选项,不参与失败统计
不复杂但容易忽略











