nginx后端故障自动剔除需配置被动检查(proxy_next_upstream+max_fails+fail_timeout)与主动健康检查(nginx_upstream_check_module),并按业务类型调优参数,最后通过停服、重启、探针等手段验证生效。

要让 Nginx 在后端节点出问题时自动踢掉它,核心是配置“失败判定 + 自动重试 + 安全回归”三环联动。光靠默认轮询不行,必须显式设置健康感知机制。
用被动检查快速响应真实请求失败
这是开箱即用、无需编译的方案,依赖实际流量触发判断:
- 必须同时配置三项:proxy_next_upstream、max_fails 和 fail_timeout,缺一不可
- 在 upstream 中为每个 server 加上 max_fails=2 fail_timeout=5s(微服务类短连接推荐值)
- 在 location 块里写明 proxy_next_upstream error timeout http_500 http_502 http_503 http_504;这样只要遇到这些错误,Nginx 就立刻换节点,不等超时
- 注意:被标记为 down 的节点不会定时探测,而是等下一个新请求来临时试探一次——成功就恢复,失败继续隔离
用主动检查提前发现“假存活”节点
被动检查有滞后性,比如凌晨服务僵死但没人访问,就无法及时剔除。这时需要主动心跳:
- 安装 nginx_upstream_check_module(OpenResty 已内置,原生 Nginx 需编译加入)
- 在 upstream 块中添加 check 指令,例如:check interval=3000 rise=2 fall=2 timeout=1000 type=http uri=/health;
- 确保后端提供轻量 /health 接口,返回 HTTP 200 且响应时间稳定在 200ms 内
- 避免用 / 或耗时接口做探针,否则会放大故障传播
按业务类型调优失败阈值
一套参数打天下容易误判或反应迟钝,应结合后端特征调整:
- 常规 Web 接口(如用户中心):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,首次失败即隔离
验证是否真正生效
配置完别只看日志,要动手验证:
- 手动停掉一台后端服务,观察 error log 是否出现 upstream failed 错误,并确认后续请求不再打过去
- 重启该服务后,curl -I http://your-nginx-ip/status(如果配了 check_status)查看状态是否变回 up
- 用 curl -v --connect-timeout 1 http://backend-ip:port/health 测试单点可达性,排除网络或防火墙干扰
- 留意 no live upstreams while connecting to upstream 这类报错——说明所有节点都被标记 down,需检查阈值是否过严











