Nginx需显式配置健康检查实现故障节点自动剔除:被动检查依赖请求失败触发(如max_fails=3/fail_timeout=30s),主动检查需第三方模块定时探测(如check interval=3 rise=2 fall=3);恢复由下一次真实请求试探完成。

Nginx 本身不自动感知后端是否宕机,轮询时照常转发请求——要实现“故障节点自动剔除”,必须显式配置健康检查机制。核心思路是:用失败判定标记节点为不可用,再靠重试与恢复逻辑完成平滑切换。开源版 Nginx 主要靠被动检查,主动探测需额外模块。
被动健康检查(开箱即用,无需编译)
这是最常用、最稳妥的方案,依赖真实请求失败来触发剔除,全部参数必须配齐且协同生效:
- 在 upstream 中为每个后端显式设置容错参数:
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
表示:30 秒内连续失败 3 次,该节点被临时标记为 down,暂停接收新请求 30 秒 - 在 location 块中启用错误重试策略:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
注意不能写http_50x,必须逐个列出;只有匹配这些条件,才会触发计数和换节点 - 务必显式设置超时,避免卡死:
proxy_connect_timeout 5s;<br>proxy_send_timeout 10s;<br>proxy_read_timeout 3s;
默认 60 秒太长,会导致单次失败拖慢整体响应
主动健康检查(需第三方模块支持)
被动检查依赖流量,在低峰期或服务刚挂掉时可能滞后。若需定时探测(如每 3 秒发一次 GET /health),必须引入 nginx_upstream_check_module(OpenResty 已内置,原生 Nginx 需编译加入):
- 在 upstream 块中添加探测指令:
check interval=3 rise=2 fall=3 timeout=1 type=http uri=/health;
含义:每 3 秒探测一次,连续 2 次成功则恢复,连续 3 次失败则剔除,单次超时 1 秒 - 后端必须提供轻量、稳定、低耗时的健康接口(如
/health),返回 HTTP 200,响应时间建议 ≤200ms - 推荐加上
default_down=true,防止 Nginx 启动时把未就绪节点误判为健康
按业务类型调优关键参数
一套参数不适合所有场景,应结合后端行为调整失败阈值:
- 常规 Web 接口(用户中心、API 网关):
max_fails=3 fail_timeout=30s - 高 QPS 短连接服务:
max_fails=15 fail_timeout=10s(放宽次数,缩短窗口,防毛刺) - 慢操作服务(导出、上传):
max_fails=2 fail_timeout=60s(避免长耗时被误判) - 强一致链路(支付回调):
max_fails=1 fail_timeout=10s(首次失败即隔离)
节点恢复机制说明
被标记为 down 的节点不会静默等待,而是由下一次真实请求触发试探:
- 当新请求到达时,Nginx 会向该节点发一次试探请求
- 若响应正常且未超时,立即恢复其可用状态,后续请求照常分发
- 若仍失败,则继续隔离,等下次请求再试
- 这意味着恢复是即时的、无固定周期的,但依赖真实流量驱动


















