## 指定共享內存 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 創建該數目的輕量線程來並發發送健康檢測請求的個數
上面的這些配置項,將作為一個上下文保存下來,在不同的階段被反復調用