upstream-healthcheck: Проверка состояния для upstream-серверов NGINX на чистом Lua
Установка
Если вы еще не подписались на RPM-репозиторий, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.
CentOS/RHEL 7 или Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-upstream-healthcheck
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-upstream-healthcheck
Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.
Этот документ описывает lua-resty-upstream-healthcheck v0.8, выпущенный 7 марта 2023 года.
http {
# пример блока upstream:
upstream foo.com {
server 127.0.0.1:12354;
server 127.0.0.1:12355;
server 127.0.0.1:12356 backup;
}
# размер зависит от количества серверов в upstream {}:
lua_shared_dict healthcheck 1m;
lua_socket_log_errors off;
init_worker_by_lua_block {
local hc = require "resty.upstream.healthcheck"
local ok, err = hc.spawn_checker{
shm = "healthcheck", -- определено "lua_shared_dict"
upstream = "foo.com", -- определено "upstream"
type = "http", -- поддерживает "http" и "https"
http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",
-- сырой HTTP-запрос для проверки
port = nil, -- порт проверки, он может отличаться от оригинального порта бэкенд-сервера, по умолчанию означает тот же, что и оригинальный бэкенд-сервер
interval = 2000, -- запуск цикла проверки каждые 2 секунды
timeout = 1000, -- 1 секунда - это тайм-аут для сетевых операций
fall = 3, -- количество последовательных сбоев, прежде чем отключить пир
rise = 2, -- количество последовательных успехов, прежде чем включить пир
valid_statuses = {200, 302}, -- список допустимых HTTP-кодов состояния
concurrency = 10, -- уровень параллелизма для тестовых запросов
-- ssl_verify = true, -- только для https, проверять ssl-сертификат или нет, по умолчанию true
-- host = foo.com, -- только для https, имя хоста в ssl-рукопожатии, по умолчанию nil
}
if not ok then
ngx.log(ngx.ERR, "не удалось запустить проверку состояния: ", err)
return
end
-- Просто вызовите hc.spawn_checker() больше раз здесь, если у вас есть
-- больше групп upstream для мониторинга. Один вызов для одной группы upstream.
-- Они могут все использовать одну и ту же shm-зону без конфликтов, но им
-- нужна большая shm-зона по очевидным причинам.
}
server {
...
# страница состояния для всех пиров:
location = /status {
access_log off;
allow 127.0.0.1;
deny all;
default_type text/plain;
content_by_lua_block {
local hc = require "resty.upstream.healthcheck"
ngx.say("PID рабочего процесса Nginx: ", ngx.worker.pid())
ngx.print(hc.status_page())
}
}
# страница состояния для всех пиров (формат prometheus):
location = /metrics {
access_log off;
default_type text/plain;
content_by_lua_block {
local hc = require "resty.upstream.healthcheck"
st, err = hc.prometheus_status_page()
if not st then
ngx.say(err)
return
end
ngx.print(st)
}
}
}
}
Описание
Эта библиотека выполняет проверку состояния для серверов-пиров, определенных в группах NGINX upstream, указанных по именам.
Методы
spawn_checker
синтаксис: ok, err = healthcheck.spawn_checker(options)
контекст: init_worker_by_lua*
Запускает фоновый таймер на основе "легких потоков" для выполнения периодических проверок состояния на указанной группе upstream NGINX с заданным хранилищем shm.
Проверка состояния не требует клиентского трафика для функционирования. Проверки выполняются активно и периодически.
Этот вызов метода асинхронный и возвращает сразу.
Возвращает true в случае успеха или nil и строку, описывающую ошибку, в противном случае.
Несколько Upstream
Можно выполнять проверки состояния на нескольких группах upstream, вызывая метод spawn_checker
несколько раз в обработчике init_worker_by_lua*. Например,
upstream foo {
...
}
upstream bar {
...
}
lua_shared_dict healthcheck 1m;
lua_socket_log_errors off;
init_worker_by_lua_block {
local hc = require "resty.upstream.healthcheck"
local ok, err = hc.spawn_checker{
shm = "healthcheck",
upstream = "foo",
...
}
...
ok, err = hc.spawn_checker{
shm = "healthcheck",
upstream = "bar",
...
}
}
Проверки состояния разных upstream используют разные ключи (всегда добавляя префикс с именем upstream к ключам), поэтому использование одного lua_shared_dict среди нескольких проверок не должно вызывать никаких проблем. Но вам нужно учесть размер общего словаря для нескольких пользователей (т.е. нескольких проверок).
Если у вас много upstream (тысячи или даже больше), то более оптимально использовать отдельные shm-зоны
для каждой (группы) upstream.
nginx.conf
http { ... } ```
Смотрите также
- модуль ngx_lua: https://github.com/openresty/lua-nginx-module
- модуль ngx_lua_upstream: https://github.com/openresty/lua-upstream-nginx-module
- OpenResty: http://openresty.org
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-upstream-healthcheck.