upstream-healthcheck: Verificador de Saúde para Servidores Upstream do NGINX em Lua Pura
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.
CentOS/RHEL 7 ou 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
Para usar esta biblioteca Lua com o NGINX, certifique-se de que o nginx-module-lua está instalado.
Este documento descreve lua-resty-upstream-healthcheck v0.8 lançado em 07 de março de 2023.
http {
# bloco upstream de exemplo:
upstream foo.com {
server 127.0.0.1:12354;
server 127.0.0.1:12355;
server 127.0.0.1:12356 backup;
}
# o tamanho depende do número de servidores em 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", -- definido por "lua_shared_dict"
upstream = "foo.com", -- definido por "upstream"
type = "http", -- suporta "http" e "https"
http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",
-- requisição HTTP bruta para verificação
port = nil, -- a porta de verificação, pode ser diferente da porta do servidor backend original, padrão significa a mesma que o servidor backend original
interval = 2000, -- executa o ciclo de verificação a cada 2 seg
timeout = 1000, -- 1 seg é o tempo limite para operações de rede
fall = 3, -- # de falhas sucessivas antes de derrubar um peer
rise = 2, -- # de sucessos sucessivos antes de ativar um peer
valid_statuses = {200, 302}, -- uma lista de códigos de status HTTP válidos
concurrency = 10, -- nível de concorrência para requisições de teste
-- ssl_verify = true, -- apenas tipo https, verifica o certificado ssl ou não, padrão true
-- host = foo.com, -- apenas tipo https, nome do host na negociação ssl, padrão nil
}
if not ok then
ngx.log(ngx.ERR, "falha ao iniciar o verificador de saúde: ", err)
return
end
-- Basta chamar hc.spawn_checker() mais vezes aqui se você tiver
-- mais grupos upstream para monitorar. Uma chamada para um grupo upstream.
-- Todos podem compartilhar a mesma zona shm sem conflitos, mas precisam de uma zona shm maior por razões óbvias.
}
server {
...
# página de status para todos os peers:
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 do Worker Nginx: ", ngx.worker.pid())
ngx.print(hc.status_page())
}
}
# página de status para todos os peers (formato 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)
}
}
}
}
Descrição
Esta biblioteca realiza verificações de saúde para peers de servidor definidos nos grupos upstream do NGINX especificados por nomes.
Métodos
spawn_checker
sintaxe: ok, err = healthcheck.spawn_checker(options)
contexto: init_worker_by_lua*
Inicia "threads leves" baseadas em temporizador em segundo plano para realizar verificações de saúde periódicas no grupo upstream do NGINX especificado com o armazenamento shm especificado.
O verificador de saúde não precisa de tráfego de cliente para funcionar. As verificações são realizadas ativamente e periodicamente.
Esta chamada de método é assíncrona e retorna imediatamente.
Retorna verdadeiro em caso de sucesso, ou nil e uma string descrevendo um erro caso contrário.
Múltiplos Upstreams
É possível realizar verificações de saúde em múltiplos grupos upstream chamando o método spawn_checker várias vezes no manipulador init_worker_by_lua*. Por exemplo,
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",
...
}
}
Os verificadores de saúde de diferentes upstreams usam chaves diferentes (sempre prefixando as chaves com o nome do upstream), portanto, compartilhar um único lua_shared_dict entre múltiplos verificadores não deve ter problemas. Mas você precisa compensar o tamanho do dicionário compartilhado para múltiplos usuários (ou seja, múltiplos verificadores). Se você tiver muitos upstreams (milhares ou até mais), então é mais otimizado usar zonas shm separadas para cada (grupo) dos upstreams.
nginx.conf
http { ... } ```
Veja Também
- o módulo ngx_lua: https://github.com/openresty/lua-nginx-module
- o módulo ngx_lua_upstream: https://github.com/openresty/lua-upstream-nginx-module
- OpenResty: http://openresty.org
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub para nginx-module-upstream-healthcheck.