Nginx原生不支持主动健康检查,需通过nginx_upstream_check_module等第三方模块实现;配置需在upstream中启用check指令并设置探测参数,状态页可访问/status查看;OpenResty+Lua提供更灵活的动态检查方案。

Nginx 原生的 upstream 模块仅支持被动健康检查(如 max_fails + fail_timeout),无法主动向后端服务发起 HTTP/TCP 探测。要实现真正的主动心跳健康检查(Active Health Check),需借助第三方模块,最常用且成熟的是 nginx_upstream_check_module。
确认 Nginx 是否已集成 upstream_check 模块
该模块非官方内置,需在编译 Nginx 时显式添加。若你使用的是预编译包(如 apt/yum 安装的 nginx),大概率未包含此模块。
- 运行
nginx -V 2>&1 | grep -o with-http_upstream_check_module,有输出说明已编译支持 - 若无输出,需重新编译 Nginx:下载对应版本源码,再下载 nginx_upstream_check_module 补丁,打补丁后 configure 加上
--add-module=/path/to/module - 部分发行版提供带该模块的第三方包(如 OpenResty 默认集成)
配置主动健康检查(HTTP 方式)
在 upstream 块中启用检查,并指定探测路径、间隔与判定逻辑:
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
<pre class="brush:php;toolbar:false;">check interval=3 rise=2 fall=5 timeout=1 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;}
-
interval=3:每 3 秒探测一次 -
rise=2:连续 2 次成功则标记为 up -
fall=5:连续 5 次失败则标记为 down -
check_http_send:发送自定义请求(推荐用 HEAD 避免传输体) -
check_http_expect_alive:响应状态码在指定范围内才视为健康
查看检查状态与调试技巧
模块提供内置状态页,便于实时监控各节点健康状况:
location /status {
check_status;
# 可加 auth_basic 或 IP 限制保障安全
}- 访问
/status可看到每个 server 的状态(up/down)、检查次数、失败次数、响应时间等 - 若某节点始终显示 down,先确认后端
/health接口是否可通、返回状态码是否符合expect_alive设置 - 日志中不会自动记录检查详情,可通过
error_log提高级别(如notice)观察连接超时或拒绝情况
替代方案:OpenResty + Lua 实现更灵活检查
若无法重编译 Nginx,或需要动态策略(如按响应内容关键字判断、调用外部 API 校验),可用 OpenResty 的 lua-resty-upstream-healthcheck 库:
- 无需修改 Nginx 编译选项,纯 Lua 实现,热加载友好
- 支持自定义检查函数,例如解析 JSON 响应中的
"status":"ok" - 配合
balancer_by_lua*可实现基于健康度的权重调度 - 注意:需启用
lua_shared_dict存储状态,且 Lua 检查是协程异步执行,不阻塞主线程


















