nginx开源版不支持原生主动健康检查,需借助nginx-plus、lua-resty-upstream-healthcheck或consul+nginx-upsync实现;nginx-plus通过health_check指令精细控制探测,开源方案依赖lua脚本或服务发现机制动态管理后端状态。

Nginx 本身不内置主动健康检查(active health check)功能,标准开源版需借助 ngx_http_upstream_module 的基础能力配合第三方模块或反向代理策略实现服务剔除;若需可靠、开箱即用的健康检查,推荐使用 nginx-plus(商业版)或在开源生态中采用 nginx + lua-resty-upstream-healthcheck 或 consul + nginx-upsync 等方案。下面分场景说明实用配置方式。
使用 nginx-plus 实现原生健康检查
nginx-plus 提供了 health_check 指令,支持 HTTP 状态码、响应内容、间隔、超时等精细控制:
- 在 upstream 块中定义后端服务,并启用健康检查:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
health_check interval=3 fails=2 passes=2 uri=/health timeout=1;
}-
interval=3:每 3 秒探测一次 -
fails=2:连续失败 2 次则标记为 down -
passes=2:连续成功 2 次才恢复为 up -
uri=/health:请求该路径(要求后端返回 200) - 被标记为 down 的节点会自动从负载均衡池中剔除,不再转发请求
开源 Nginx + lua-resty-upstream-healthcheck(推荐轻量级方案)
适用于已有 OpenResty 环境,通过 Lua 脚本实现异步健康探测与动态更新 upstream:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 确保已安装
lua-resty-upstream-healthcheck(通常随 OpenResty 自带) - 在
http块中初始化健康检查器:
lua_shared_dict healthcheck_dict 1m;
init_worker_by_lua_block {
local hc = require "resty.upstream.healthcheck"
hc.spawn_checker{
shm = "healthcheck_dict",
upstream_name = "backend",
checks = {
interval = 2,
rise = 2,
fall = 3,
timeout = 1,
http_req = "GET /health HTTP/1.1\r\nHost: example.com\r\n\r\n",
http_expect_status = 200,
}
}
}- 对应 upstream 需启用
dynamic类型(由 lua 动态管理):
upstream backend {
server 0.0.0.0:1; # 占位,实际由 lua 动态填充
balancer_by_lua_block {
-- 使用 resty.upstream.round_robin 或自定义调度逻辑
local balancer = require "resty.upstream.balancer"
balancer.set_current_upstream("backend")
balancer.balance()
}
}- 后端需提供
/health接口,返回 HTTP 200 表示存活 - 探测失败达到
fall次数后,节点自动从可用列表中移除
用 Consul + nginx-upsync 实现服务发现与自动剔除
适合微服务架构,将健康状态交由 Consul 统一维护,Nginx 通过 upsync 模块定时拉取最新 healthy 实例列表:
- 部署 Consul,并确保每个后端服务注册时携带健康检查(如 TCP/HTTP)
- 编译安装支持
nginx-upsync-module的 Nginx(或使用预编译 OpenResty 版本) - 配置 upstream 动态同步:
upstream backend {
upsync 127.0.0.1:8500/v1/kv/upstreams/backend/ upsync_timeout=6m upsync_interval=5s upsync_dump_path=/usr/local/nginx/conf/upstream.conf;
upsync_dump_path /usr/local/nginx/conf/upstream.conf;
include /usr/local/nginx/conf/upstream.conf;
}- Consul 中
upstreams/backend/下的每个 KV 键值对代表一个后端地址,Consul 健康检查失败时自动删除该 key - Nginx 每 5 秒拉取一次,自动增删节点,无需 reload
注意事项与常见问题
无论采用哪种方式,都需注意:
- 后端健康接口应轻量、无副作用(如不触发业务逻辑),建议独立路径(如
/health或/actuator/health) - 避免健康检查请求压垮后端——控制频率、超时和并发数
- 开源 Nginx 默认不支持自动恢复 down 节点,需依赖外部机制(如 lua 检查器或 consul)闭环
- 日志中可通过
$upstream_addr和$upstream_state变量观察实际转发目标及状态(如up/down)










