upstream-healthcheck: Gesundheitsprüfer für NGINX Upstream-Server in Pure Lua
Installation
Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.
CentOS/RHEL 7 oder 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
Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.
Dieses Dokument beschreibt lua-resty-upstream-healthcheck v0.8, das am 07. März 2023 veröffentlicht wurde.
http {
# Beispiel für einen upstream-Block:
upstream foo.com {
server 127.0.0.1:12354;
server 127.0.0.1:12355;
server 127.0.0.1:12356 backup;
}
# Die Größe hängt von der Anzahl der Server in upstream {} ab:
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", -- definiert durch "lua_shared_dict"
upstream = "foo.com", -- definiert durch "upstream"
type = "http", -- unterstützt "http" und "https"
http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",
-- rohe HTTP-Anfrage zur Überprüfung
port = nil, -- der Prüfport, kann anders sein als der ursprüngliche Backend-Serverport, Standard bedeutet dasselbe wie der ursprüngliche Backend-Server
interval = 2000, -- den Prüfzyklus alle 2 Sekunden ausführen
timeout = 1000, -- 1 Sekunde ist das Timeout für Netzwerkoperationen
fall = 3, -- Anzahl der aufeinanderfolgenden Fehler, bevor ein Peer deaktiviert wird
rise = 2, -- Anzahl der aufeinanderfolgenden Erfolge, bevor ein Peer aktiviert wird
valid_statuses = {200, 302}, -- eine Liste gültiger HTTP-Statuscodes
concurrency = 10, -- Parallelitätsniveau für Testanfragen
-- ssl_verify = true, -- nur für https, SSL-Zertifikat überprüfen oder nicht, Standard ist true
-- host = foo.com, -- nur für https, Hostname im SSL-Handshake, Standard ist nil
}
if not ok then
ngx.log(ngx.ERR, "Fehler beim Starten des Gesundheitsprüfers: ", err)
return
end
-- Rufen Sie hier einfach hc.spawn_checker() mehrmals auf, wenn Sie
-- mehr upstream-Gruppen überwachen möchten. Ein Aufruf für eine upstream-Gruppe.
-- Sie können alle denselben shm-Bereich ohne Konflikte teilen, benötigen jedoch
-- aus offensichtlichen Gründen einen größeren shm-Bereich.
}
server {
...
# Statusseite für alle 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("Nginx Worker PID: ", ngx.worker.pid())
ngx.print(hc.status_page())
}
}
# Statusseite für alle Peers (Prometheus-Format):
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)
}
}
}
}
Beschreibung
Diese Bibliothek führt Gesundheitsprüfungen für Server-Peers durch, die in NGINX upstream-Gruppen definiert sind, die durch Namen angegeben sind.
Methoden
spawn_checker
Syntax: ok, err = healthcheck.spawn_checker(options)
Kontext: init_worker_by_lua*
Startet zeitgesteuerte "leichte Threads" im Hintergrund, um regelmäßige Gesundheitsprüfungen für die angegebene NGINX-Upstream-Gruppe mit dem angegebenen shm-Speicher durchzuführen.
Der Gesundheitsprüfer benötigt keinen Client-Verkehr, um zu funktionieren. Die Prüfungen werden aktiv und regelmäßig durchgeführt.
Dieser Methodenaufruf ist asynchron und gibt sofort zurück.
Gibt im Erfolgsfall true zurück, oder nil und eine Zeichenfolge, die einen Fehler beschreibt, andernfalls.
Mehrere Upstreams
Man kann Gesundheitsprüfungen für mehrere upstream-Gruppen durchführen, indem man die spawn_checker-Methode mehrfach im init_worker_by_lua*-Handler aufruft. Zum Beispiel,
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",
...
}
}
Die Gesundheitsprüfer verschiedener Upstreams verwenden unterschiedliche Schlüssel (indem sie die Schlüssel immer mit dem
Upstream-Namen voranstellen), sodass das Teilen eines einzelnen lua_shared_dict unter mehreren Prüfern keine Probleme verursachen sollte. Aber Sie müssen die Größe des gemeinsamen Dictionärs für mehrere Benutzer (d.h. mehrere Prüfer) berücksichtigen.
Wenn Sie viele Upstreams (Tausende oder sogar mehr) haben, ist es optimaler, separate shm-Zonen
für jede (Gruppe) der Upstreams zu verwenden.
nginx.conf
http { ... } ```
Siehe auch
- das ngx_lua-Modul: https://github.com/openresty/lua-nginx-module
- das ngx_lua_upstream-Modul: https://github.com/openresty/lua-upstream-nginx-module
- OpenResty: http://openresty.org
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-upstream-healthcheck.