Nginx主动健康检查需通过源码编译nginx_upstream_check_module模块,在upstream中配置check指令实现定时探测,支持HTTP/TCP/SSL等多种类型,并配合check_status页面监控及proxy_next_upstream兜底容错。

要让 Nginx 对后端集群做主动健康检查,核心是使用 nginx_upstream_check_module 模块,在 upstream 块中添加 check 指令。它不依赖真实请求,而是独立定时发探测包,实时判断节点是否可用。
必须源码编译安装模块
该模块未被官方集成,开源版 Nginx 默认不带。不能通过包管理器安装,只能手动打补丁并重新编译:
- 下载与当前 Nginx 版本严格一致的源码(如
nginx-1.28.0)和对应版本的 check 模块(推荐 v0.4.0) - 选取匹配的补丁文件(例如 Nginx 1.28.0 应选
check_1.26.1+.patch),执行patch -p1 -
configure时加入--add-module=/path/to/nginx_upstream_check_module-0.4.0,其他参数建议复用原安装配置(可查nginx -V) - 执行
make && make install,完成后运行nginx -V确认输出中含check_module
在 upstream 中启用 check 指令
配置写在 upstream 块内,对整个组生效,不作用于单个 server 行:
-
check interval=3 rise=2 fall=3 timeout=1 type=http:每 3 秒探测一次,连续 2 次成功标记为健康,连续 3 次失败下线,单次超时 1 秒 -
type=http支持自定义探测内容:check_http_send "HEAD /health HTTP/1.0\r\n\r\n"发送指定请求 -
check_http_expect_alive http_2xx http_3xx定义哪些响应状态码算健康 - 也支持
type=tcp(仅连通性)、type=ssl_hello(验证 TLS 握手)等轻量模式
暴露健康状态页面用于监控
需单独配置一个 location 来展示实时节点状态,便于人工查看或接入 Prometheus 等监控系统:
- 添加
location /status { check_status; access_log off; } - 访问
/status可看到每个后端 IP、端口、当前状态(up/down)、失败次数、检测间隔等信息 - 建议加访问控制,如
allow 192.168.10.0/24; deny all;
搭配 proxy_next_upstream 提升容错能力
主动检查再准也有盲区(如网络抖动导致某次探测漏判),所以仍需保留兜底策略:
- 在
location块中设置proxy_next_upstream error timeout http_502 http_504; - 当某次转发因后端异常返回 502 或超时,Nginx 会自动重试下一个健康节点
- 这层机制和主动检查形成纵深防御,避免单点故障影响整体可用性


















