nginx通过被动检查(请求失败触发标记)、主动检查(心跳探测)和兜底策略(backup节点+权重)实现后端服务自动剔除与恢复。

被动检查:靠真实请求失败自动标记
这是最常用、无需额外模块的方案,依赖流量自然触发判断:
- 在 upstream 中为每个后端 server 显式配置 max_fails 和 fail_timeout,例如:
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s; - 在 location 块中启用重试逻辑:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; - 当某节点连续 3 次出现连接拒绝、超时或返回 5xx,Nginx 就把它标记为 down,接下来 30 秒内不再转发新请求
- 30 秒后,下一次请求会试探性发过去——成功则重新加入轮询,失败继续隔离
主动检查:提前发现“假存活”节点
被动方式有滞后性,比如服务卡死但没请求打过去,就无法及时剔除。这时需要主动心跳探测:
- 使用 nginx_upstream_check_module(OpenResty 已内置,原生 Nginx 需编译)
- 在 upstream 块中添加检查指令,例如:
check interval=3000 rise=2 fall=3 timeout=1000 type=http uri=/health; - 后端必须提供轻量、稳定、低延迟的健康接口(如
/health),返回 HTTP 200,响应时间建议 ≤200ms - 避免用
/或耗时接口做探针,否则可能拖慢整个集群
兜底策略:backup 节点与权重协同
即使主节点全挂,也要保障基本可用性:
- 在 upstream 中定义 backup 节点,例如:
server 192.168.1.13:8080 backup;,它只在所有非 backup 节点都不可用时才启用 - 结合 weight 可控制正常流量分布,比如高配机器设
weight=3,低配设weight=1;故障发生后,剩余健康节点按权重分担流量 - 注意:weight 不影响故障判定,只影响健康状态下的流量比例
验证是否真正生效
配置完不能只看语法正确,要动手验证效果:
- 手动停掉一台后端服务,观察 Nginx error log 是否出现
upstream failed,并确认后续请求不再打过去 - 重启该服务后,用
curl -I http://your-nginx-ip/status(需配置 check_status)查看状态是否变回up - 用
curl -v --connect-timeout 1 http://back模拟快速探测,确认响应行为符合预期











