nginx原生不支持主动健康检查,需依赖nginx_upstream_check_module弥补被动检查滞后、无法预判慢节点等缺陷;该模块支持http/tcp等主动探测,配合被动策略实现高可用故障转移。

Nginx 本身不支持开箱即用的主动健康检查,故障转移能力依赖于后端节点状态感知的及时性。要实现真正可靠的故障转移,必须结合第三方模块(如 nginx_upstream_check_module)补足原生机制的短板——被动检查滞后、无法预判缓慢节点、缺乏实时心跳探测等关键缺陷。
为什么原生被动检查不够用
默认配置下,Nginx 只在用户请求失败后才开始计数标记节点不可用:
- 第一个发往故障节点的请求必然失败,影响用户体验
- 响应变慢(如 RT 从 100ms 升至 5s)但未超时或返回 5xx 时,不会触发隔离
- fail_timeout 到期后会盲目重试,可能反复冲击已部分恢复但仍不稳定的节点
用 nginx_upstream_check_module 实现主动探测
该模块由淘宝系开源并长期维护,支持 HTTP/TCP/SSL/MySQL 等多种探测类型,核心是让 Nginx 主动发探针而非等待错误发生:
- 在 upstream 块中添加
check指令,例如:check interval=3000 rise=2 fall=5 timeout=1000 type=http - 搭配
check_http_send发送定制化请求,如"HEAD /health HTTP/1.0\r\n\r\n" - 用
check_http_expect_alive定义成功标准,例如http_2xx http_3xx,避免把 404 当作异常
与被动机制协同提升容错鲁棒性
主动检查解决“发现快”,被动检查保障“兜得住”。两者不是替代关系,而是互补组合:
- 主动检查将节点标记为
down后,Nginx 自动跳过该节点转发请求 - 仍需保留
proxy_next_upstream配置(如error timeout http_502),应对探测窗口外突发故障 - 可设不同
max_fails和fail_timeout,让被动策略作为主动检查的后备防线
部署要点提醒
该模块非官方内置,需源码编译集成:
- 下载对应 Nginx 版本的补丁(如 nginx-1.24.x 需用
check_1.24.0+.patch) - configure 时通过
--add-module=路径引入模块 - 启动后可通过
/upstream_status接口(需启用upstream_check_status)查看实时状态











