Nginx原生不支持主动HTTP心跳检测,需依赖nginx_upstream_check_module等第三方模块实现;该模块支持TCP/HTTP周期探测、状态码判断及status页面监控,OpenResty+Lua可扩展复杂健康逻辑。

Nginx 本身不支持主动向后端服务发送 HTTP 心跳请求(如定期 GET /health)来判断其可用性,原生 upstream 的健康检查仅限被动检测(如连接失败、超时、返回 5xx 等)。要实现真正的“主动心跳检测”,必须借助第三方模块,最常用且成熟的是 nginx_upstream_check_module。
使用 nginx_upstream_check_module 实现主动 HTTP 心跳
该模块由淘宝开源,已广泛用于生产环境,支持 TCP 和 HTTP 模式的周期性主动探测。它能定时向每个后端节点发起指定路径的请求(如 /health),根据响应状态码、内容或超时情况动态标记节点为 up/down。
- 编译时需显式添加:
--add-module=/path/to/nginx_upstream_check_module - 在
upstream块中启用检查,并配置探测参数:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
<pre class="brush:php;toolbar:false;">check interval=3 rise=2 fall=5 timeout=1;
check_http_send "GET /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;}
说明:
– interval=3:每 3 秒探测一次
– rise=2:连续 2 次成功则恢复为可用
– fall=5:连续 5 次失败则标记为不可用
– check_http_send:自定义请求内容,支持带 Host 头(如 "GET /health HTTP/1.1\r\nHost: api.example.com\r\n\r\n")
– check_http_expect_alive:指定哪些状态码视为“存活”,默认只认 2xx
配合 status 页面实时查看健康状态
该模块内置一个简单状态页,可用于人工巡检或对接监控系统:
- 在 server 块中添加 location:
location /status {
check_status;
# 可加 auth_basic 或 IP 限制
}访问 /status 将显示各后端节点的当前状态(up/down)、探测次数、失败次数、上次检测时间等。输出为 HTML 表格,也支持 JSON 格式(加参数 ?format=json),方便 Prometheus 或 Zabbix 抓取。
与 OpenResty + Lua 协同做更灵活的健康决策
若需更复杂的逻辑(如根据响应体 JSON 字段判断、调用外部 API 校验、结合业务指标熔断),可搭配 OpenResty 使用 lua-resty-upstream-healthcheck 模块:
- 纯 Lua 实现,无需重新编译 Nginx
- 支持自定义探测函数(可解析 JSON、校验字段值、记录日志)
- 可与 shared_dict 配合实现跨 worker 共享状态
示例片段(在 init_worker_by_lua_block 中启动):
local healthcheck = require "resty.upstream.healthcheck"
healthcheck.spawn_checker{
upstream_name = "backend",
check_type = "http",
port = 8080,
check_timeout = 1,
check_interval = 3,
fall_count = 3,
rise_count = 2,
req_uri = "/health",
req_headers = {"Host: api.example.com"},
expected_statuses = {200},
expected_body = '"status":"up"',
}注意事项与常见问题
主动检查虽强大,但部署时需注意:
- 后端服务的
/health接口必须轻量、无副作用、高可用(避免健康检查本身成为瓶颈) - 探测频率不宜过高(尤其集群规模大时),建议 3–10 秒;太频繁可能被后端限流
- 确保后端防火墙/安全组放行探测源 IP(Nginx 所在机器)到目标端口
- 原生 Nginx Plus 商业版提供更完善的主动健康检查(含 gRPC、TLS 握手检测等),但需付费











