nginx轮询需依赖健康检查机制实现自动剔除故障节点:被动检查通过max_fails/fail_timeout和proxy_next_upstream等配置触发;主动检查需编译nginx_upstream_check_module,配置http探测及后端/health接口。

被动健康检查:靠真实请求触发故障识别
这是最常用、无需编译的方案,依赖请求失败来标记节点异常:
- 在 upstream 中每个 server 显式加容错参数:
max_fails=3 fail_timeout=30s。表示 30 秒内连续失败 3 次,该节点被临时屏蔽 30 秒 - 在 location 块中启用错误重试:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504。注意不能写http_50x,必须逐个列出 - 必须设超时,否则卡住的请求无法快速失败:
proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s;
主动健康检查:提前发现“假存活”节点
被动检查依赖流量,低峰期或刚挂掉时可能滞后。用 nginx_upstream_check_module 可主动探测:
- 编译 Nginx 时加入该模块(OpenResty 已内置),或使用支持它的发行版
- 在 upstream 中添加探测配置:
check interval=3 rise=2 fall=3 timeout=1 type=http uri=/health; - 后端需提供轻量
/health接口,返回 200 且响应稳定(建议 - 搭配
check_status指令暴露监控页,实时查看节点 up/down 状态
平滑切流的关键控制点
剔除只是第一步,真正平滑在于“不丢请求、不断连接、不放大压力”:
- 下线前可先设
weight=0或down,立即停止新请求分发,已有连接继续处理 - 调大
proxy_read_timeout(如 60–90s),匹配业务最长耗时,避免 Nginx 提前中断后端正在执行的任务 - 开启
proxy_ignore_client_abort on,防止用户关闭页面导致后端任务被意外终止 - 重试次数限制为
proxy_next_upstream_tries 2,避免单点故障引发全链路重试风暴
故障恢复不是定时轮询,而是“试探即恢复”
被标记为 down 的节点不会等待定时心跳,而是在下一个真实请求到来时,Nginx 主动发一次试探:
- 试探成功(连得上、响应正常、未超时)→ 立即恢复可用,后续请求照常进入轮询队列
- 试探失败 → 继续保持 down,等下次请求再试
- 若所有节点都 down,Nginx 会强制重试全部节点,此时已恢复的服务能立刻承接流量











