## 指定共享内存
lua_shared_dict healthcheck 1m;
## 在worker初始化过程中,启动定时器,进行后端结点的检查
init_worker_by_lua_block {
local hc = require "resty.upstream.healthcheck"
local ok, err = hc.spawn_checker {
-- shm 表示共享内存区的名称,
shm = "healthcheck",
-- type 表示健康检查的类型, HTTP or TCP (目前只支持http)
type = "http",
-- upstream 指定 upstream 配置的名称
upstream = "api.cargolist.xihuishou.bsdd.me",
-- 如果是http类型,指定健康检查发送的请求的URL
http_req = "GET /health.txt HTTP/1.0\r\nHost: api.cargolist.xihuishou.bsdd.me\r\n\r\n",
-- 请求间隔时间,默认是 1 秒。最小值为 2毫秒
interval = 2000,
-- 请求的超时时间。 默认值为:1000 毫秒
timeout = 5000,
-- 失败多少次后,将节点标记为down。 默认值为 5
fall = 3,
-- 成功多少次后,将节点标记为up。默认值为 2
rise = 2,
-- 返回的http状态码,表示应用正常
valid_statuses = {200, 302},
-- 并发度, 默认值为 1
concurrency = 1,
}
if not ok then
ngx.log(ngx.ERR, "=======> failed to spawn health checker: ", err)
return
end
}
# 配置监控检查访问页面
location /server/status {
access_log off;
default_type text/plain;
content_by_lua_block {
local hc = require "resty.upstream.healthcheck"
ngx.say("Nginx Worker PID: ", ngx.worker.pid())
ngx.print(hc.status_page())
}
}
配置参数解释
hc.spawn_checker(options)
options中包含如下选项,在调用该接口时作为参数传递进来
type 必须存在并且是http,目前只支持http
http_req 必须存在,健康探测的http请求raw字符串
timeout 默认1000,单位ms
interval 健康探测的时间间隔,单位ms, 默认1000,推荐2000
valid_status 合法响应码的表,比如{200, 302}
concurrency 并发数,默认1
fall 默认5,对UP的设备,连续fall次失败,认定为DOWN
rise 默认2,对DOWN的设备,连续rise次成功,认定为UP
shm 必须配置,用于健康检查的共享内存名称,通过ngx.shared[shm]得到共享内存
upstream 指定要做健康检查的upstream组名,必须存在
version 默认0
primary_peers 主组
backup_peers 备组
statuses 存放合法响应码的数组,来自ipairs()得到的valid_status配置项
根据options会构造一个ctx表来存放所有的配置数据,并会作为定时器ngx.timer.at()中的第三个参数
ctx的内容如下
upstream 指定的upstream组名
primary_peers 主组
backup_peers 备组
http_req 健康检查的raw http请求
timeout 超时时间,单位s,注意不是ms
interval 健康检查的间隔,单位s,注意不是ms
dict 存放统计数据的共享内存
fall 认为DOWN之前的连续失败次数,默认5
rise 认为UP之前的连续成功次数,默认2
statuses 认为正常的http状态码的表{200,302}
version 0 每次执行定时任务时的版本号,有peer状态改变,版本号加1
concurrency 创建该数目的轻量线程来并发发送健康检测请求的个数
上面的这些配置项,将作为一个上下文保存下来,在不同的阶段被反复调用