如何用Nginx和lua-resty-upstream-healthcheck实现长尾词的主动节点健康检测?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1260个文字,预计阅读时间需要6分钟。
由于 `lua-resty-upstream-healthcheck` 不是 Nginx 官方模块,也不在 `upstream` 模块中通过 `health_check` 指令启用,这是 Nginx Plus 的功能。您已安装了 Lua 库,但没有调用它,因此 Nginx 完全不知道您正在尝试进行什么测试。
真正生效的方式是:手动创建一个定时器(ngx.timer.at),在回调里用 checker:check() 主动轮询后端节点,并根据结果动态更新 shared_dict 中的节点状态。Nginx 的 upstream 本身不会自动读这个状态,你还得配合 balancer_by_lua* 阶段做路由决策。
- 必须在
init_worker_by_lua_block里启动健康检查器,否则 worker 进程间状态不共享或重复初始化 -
shared_dict要提前在http块声明,大小建议 ≥1m(存 IP+端口+状态+时间戳) - 检查器默认只标记“异常”,不自动剔除节点;剔除逻辑必须你自己在
balancer_by_lua_block里查字典、过滤掉 down 的节点
如何在 balancer_by_lua_block 里跳过已下线节点
这是最关键的路由控制点。Nginx 在这里把请求交给哪个后端,完全由你决定。不能依赖 upstream 的内置负载逻辑,得自己从 upstream 配置中提取所有 server,再逐个查健康状态。
本文共计1260个文字,预计阅读时间需要6分钟。
由于 `lua-resty-upstream-healthcheck` 不是 Nginx 官方模块,也不在 `upstream` 模块中通过 `health_check` 指令启用,这是 Nginx Plus 的功能。您已安装了 Lua 库,但没有调用它,因此 Nginx 完全不知道您正在尝试进行什么测试。
真正生效的方式是:手动创建一个定时器(ngx.timer.at),在回调里用 checker:check() 主动轮询后端节点,并根据结果动态更新 shared_dict 中的节点状态。Nginx 的 upstream 本身不会自动读这个状态,你还得配合 balancer_by_lua* 阶段做路由决策。
- 必须在
init_worker_by_lua_block里启动健康检查器,否则 worker 进程间状态不共享或重复初始化 -
shared_dict要提前在http块声明,大小建议 ≥1m(存 IP+端口+状态+时间戳) - 检查器默认只标记“异常”,不自动剔除节点;剔除逻辑必须你自己在
balancer_by_lua_block里查字典、过滤掉 down 的节点
如何在 balancer_by_lua_block 里跳过已下线节点
这是最关键的路由控制点。Nginx 在这里把请求交给哪个后端,完全由你决定。不能依赖 upstream 的内置负载逻辑,得自己从 upstream 配置中提取所有 server,再逐个查健康状态。

