lua-resty-upstream-healthcheck支持nginx对upstream后端节点主动健康探测并动态摘除/恢复,无需reload配置;需openresty 1.21.4.1+,通过init_worker_by_lua_block初始化检查器,用add_peer/remove_peer运行时管理节点,proxy_pass自动路由至健康节点。

使用 lua-resty-upstream-healthcheck 可以让 Nginx 在不依赖外部工具的前提下,对 upstream 中的后端节点进行主动健康探测,并自动摘除或恢复节点——关键是它支持运行时动态更新,无需 reload 配置。
一、前置准备:安装与基础配置
该模块不是 Nginx 内置模块,需确保你使用的 OpenResty(推荐 1.21.4.1+)或已手动编译接入 lua-resty-upstream-healthcheck。OpenResty 默认已包含,只需确认:
- 检查
resty/upstream/healthcheck.lua是否存在于lualib/resty/目录下 - Nginx 配置中已启用
lua_package_path,指向 OpenResty 的 lualib 路径
示例路径设置(通常 OpenResty 已预设,可跳过):
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
二、定义 upstream 并启用健康检查
注意:必须用 lua-resty-upstream-healthcheck 管理的 upstream,不能直接写死在 upstream {} 块里。实际节点由 Lua 动态维护。
典型做法是:先在 http 块中声明一个空 upstream(仅作占位),再用 Lua 创建并管理真实后端列表:
upstream backend_pool {
# 空 upstream,仅用于 proxy_pass 引用
}然后在 init_worker_by_lua_block 中初始化健康检查器:
init_worker_by_lua_block {
local healthcheck = require "resty.upstream.healthcheck"
<pre class="brush:php;toolbar:false;">-- 创建健康检查实例,绑定到名为 "backend_pool" 的 upstream
local ok, err = healthcheck.spawn_checker{
upstream_name = "backend_pool",
check_type = "http",
check_http_send = "HEAD /health HTTP/1.0\r\nHost: localhost\r\n\r\n",
check_http_expect_alive = {200, 302},
check_interval = 2, -- 每 2 秒探测一次
check_timeout = 1, -- 单次探测超时 1 秒
fall_count = 3, -- 连续失败 3 次标记为 down
rise_count = 2, -- 连续成功 2 次恢复为 up
valid_concurrency = 1, -- 并发探测数(避免压垮后端)
}
if not ok then
ngx.log(ngx.ERR, "failed to spawn health checker: ", err)
end}
三、动态添加/删除节点(运行时生效)
节点增删通过 Lua API 完成,无需修改配置、无需 reload。常用操作如下:
-
添加节点:
healthcheck.add_peer("backend_pool", "192.168.1.10:8080") -
移除节点:
healthcheck.remove_peer("backend_pool", "192.168.1.10:8080") -
查看当前节点状态:
healthcheck.get_peers("backend_pool")返回 table,含addr、down、rise_count等字段
建议封装成简单的 admin 接口(如 /api/upstream/add),接收 POST 参数执行添加逻辑,实现运维自助化。
四、配合 proxy_pass 使用并观察效果
在 server 块中正常代理即可,Nginx 会自动路由到当前健康的节点:
server {
listen 80;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}验证方式:
- 启动后,访问
/health返回 200 的节点会被标记为up - 手动停掉某个后端服务,约 6 秒(3×2s)后,
get_peers()将显示其down=true - 重启该后端,约 4 秒(2×2s)后自动恢复流量
日志中可通过 error.log 查看探测结果(开启 ngx.log(ngx.INFO, ...) 可增强调试输出)。











