ngx_http_upstream_hc_module 是 Nginx Plus 专属模块,用于主动健康检查:定期发送探测请求(如 HEAD/GET),依据状态码、超时、响应体等判定节点可用性,并自动剔除或恢复;开源版不支持,需通过 nginx -V 确认编译选项。

ngx_http_upstream_hc_module 是 Nginx 官方商业版(Nginx Plus)提供的模块,用于对 upstream 中的后端服务器执行主动健康检查(Active Health Checks),它能定期发送探测请求(如 HTTP HEAD/GET),根据响应状态码、超时、响应体等判断节点是否可用,并自动从负载均衡池中剔除或恢复节点。开源版 Nginx 不包含该模块,需确认你使用的是 Nginx Plus(以 nginx -V 输出含 --with-http_upstream_hc_module 为准)。
启用主动健康检查的基本配置
在 upstream 块中添加 health_check 指令即可开启基础探测:
- 默认每 5 秒向每个节点发送一次 HEAD 请求,要求返回 2xx 或 3xx 状态码才视为健康
- 连续 2 次失败标记为不健康,连续 1 次成功恢复为健康(可调)
- 必须配合
keepalive使用以复用连接,提升探测效率
示例配置:
upstream backend {server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
health_check interval=3 fails=3 passes=2 uri=/health;
}
}
自定义探测行为的关键参数
通过 health_check 的参数可精准控制探测逻辑:
- interval=3:探测间隔设为 3 秒(默认 5s),过短可能增加后端压力,过长影响故障发现时效
- fails=3:连续 3 次失败才标记为 down(默认 2),适用于偶发抖动场景
- passes=2:连续 2 次成功才恢复为 up(默认 1),避免误恢复
- uri=/health:指定探测路径,建议后端提供轻量级健康接口(如返回 200 + JSON {"status":"ok"})
-
match=my_match:结合
match块校验响应内容,例如检查响应体是否含 "healthy"
高级匹配:用 match 块校验响应细节
仅靠状态码不够可靠,可通过 match 定义更严格的健康判定规则:
status 200;
header Content-Type = "application/json";
body ~ "healthy";
}
health_check match=is_healthy uri=/health;
上述配置要求响应必须是 200、Content-Type 为 JSON、且响应体正则匹配 "healthy" —— 三者同时满足才算健康,大幅降低误判率。
监控与排障要点
健康检查状态可通过 Nginx Plus 的实时仪表盘或 API 查看:
- 访问
/status接口(需启用status_zone)可获取各节点的 up/down 状态、失败次数、最后检查时间 - 日志中出现
upstream server temporarily disabled表示已被踢出,注意排查是网络问题、后端超时还是匹配失败 - 若所有节点频繁切换状态,优先检查
interval是否过短、后端/health接口性能是否不足、或match规则是否过于严格
不复杂但容易忽略:确保后端健康接口本身高可用、低延迟、不依赖下游服务,否则健康检查反而成为单点故障源。











