轮询模式需搭配被动健康检查才能自动剔除故障节点,其依赖upstream中server的max_fails/fail_timeout、location中proxy_next_upstream及显式超时参数三者协同生效。

轮询模式本身不识别后端是否存活,必须搭配被动健康检查机制才能实现故障节点自动剔除。只写 upstream 里的 server 列表,Nginx 会照常转发请求——哪怕某台机器已关机,也会发过去,超时后返回 502/504,下次还试。
基础三要素缺一不可
被动健康检查不是设一个参数就生效,而是三个配置协同作用:
-
upstream 中每个 server 必须带 max_fails 和 fail_timeout:例如
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;。表示在 30 秒内连续失败 3 次,该节点被标记为 down,并暂停接收新请求 30 秒。 -
location 中必须启用 proxy_next_upstream:仅配
proxy_pass不够。推荐写全:proxy_next_upstream error timeout http_500 http_502 http_503 http_504;。只有这些错误才会触发重试,也才会计入max_fails计数。 -
必须显式设置超时参数:默认
proxy_read_timeout是 60 秒,后端卡住会导致单次请求堵满一分钟。建议设为更短值,例如:proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s;,确保失败能快速判定并进入重试流程。
按业务类型调优失败阈值
统一用 max_fails=3 fail_timeout=30s 容易误剔或迟剔,应结合后端响应特征调整:
-
常规 Web 接口(如用户中心):保持
max_fails=3 fail_timeout=30s,兼顾网络抖动过滤与故障响应速度。 -
高 QPS 网关(如 API 入口):设
max_fails=15 fail_timeout=10s,扩大容错次数、缩短统计窗口,避免毛刺引发频繁切换。 -
慢操作服务(如导出、上传):改用
max_fails=2 fail_timeout=60s,防止一次长耗时请求被误判为故障。 -
强一致关键链路(如支付回调):用
max_fails=1 fail_timeout=10s,首次失败即隔离,宁可保守也不冒险。
自动恢复不是定时心跳,而是“请求试探”
被标记为 down 的节点不会定期探测,而是在下一个真实请求到达时,Nginx 主动向它发一次试探请求:
- 试探成功(连接建立、响应正常、未超时)→ 立即恢复可用状态,后续请求照常分发;
- 试探失败 → 继续标记为 down,等下一个请求再来重试;
- 若所有主节点都 down 了,Nginx 会强制重试全部节点(包括刚被标记 down 的),此时若某台已恢复,就能立刻承接流量。
低流量场景需主动检查补位
被动检查依赖真实请求,凌晨或低峰期可能几十秒甚至几分钟都不触发恢复。如需更高可靠性:
- 引入
nginx_upstream_check_module(OpenResty 默认集成),配置定时 HTTP 探活:check interval=3 rise=2 fall=5 timeout=1 type=http;; - 搭配
check_http_send和check_http_expect_alive指定探测路径与健康响应码; - 通过
location /status { check_status; }暴露实时健康状态页,便于监控和排查。


















