lua-upstream: Lua-API zur Steuerung von NGINX-Upstreams
Installation
Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:
- RedHat Enterprise Linux 7, 8, 9 und 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-lua-upstream
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 nginx-module-lua-upstream
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_lua_upstream_module.so;
Dieses Dokument beschreibt nginx-module-lua-upstream v0.7, das am 15. Mai 2017 veröffentlicht wurde.
http {
upstream foo.com {
server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;
server agentzh.org:81;
}
upstream bar {
server 127.0.0.2;
}
server {
listen 8080;
# Beispielausgabe für die folgende /upstream-Schnittstelle:
# upstream foo.com:
# addr = 127.0.0.1:80, weight = 4, fail_timeout = 53, max_fails = 100
# addr = 106.184.1.99:81, weight = 1, fail_timeout = 10, max_fails = 1
# upstream bar:
# addr = 127.0.0.2:80, weight = 1, fail_timeout = 10, max_fails = 1
location = /upstreams {
default_type text/plain;
content_by_lua_block {
local concat = table.concat
local upstream = require "ngx.upstream"
local get_servers = upstream.get_servers
local get_upstreams = upstream.get_upstreams
local us = get_upstreams()
for _, u in ipairs(us) do
ngx.say("upstream ", u, ":")
local srvs, err = get_servers(u)
if not srvs then
ngx.say("Fehler beim Abrufen der Server im Upstream ", u)
else
for _, srv in ipairs(srvs) do
local first = true
for k, v in pairs(srv) do
if first then
first = false
ngx.print(" ")
else
ngx.print(", ")
end
if type(v) == "table" then
ngx.print(k, " = {", concat(v, ", "), "}")
else
ngx.print(k, " = ", v)
end
end
ngx.print("\n")
end
end
end
}
}
}
}
Funktionen
get_upstreams
syntax: names = upstream.get_upstreams()
Holen Sie sich eine Liste der Namen aller benannten Upstream-Gruppen (d.h. explizite upstream {}-Blöcke).
Beachten Sie, dass implizite Upstream-Gruppen, die durch proxy_pass usw. erstellt wurden, ausgeschlossen sind.
get_servers
syntax: servers = upstream.get_servers(upstream_name)
Holen Sie sich die Konfigurationen für alle Server in der angegebenen Upstream-Gruppe. Beachten Sie, dass ein Server mehrere Adressen haben kann, wenn sein Servername auf mehrere Adressen aufgelöst werden kann.
Der Rückgabewert ist eine array-ähnliche Lua-Tabelle. Jeder Tabelleneintrag ist eine hash-ähnliche Lua-Tabelle, die die folgenden Schlüssel enthält:
-
addr
Socket-Adresse(n). kann entweder eine Lua-Zeichenkette oder eine array-ähnliche Lua-Tabelle von Lua-Zeichenketten sein. * backup * fail_timeout * max_fails * name * weight
get_primary_peers
syntax: peers = upstream.get_primary_peers(upstream_name)
Holen Sie sich die Konfigurationen für alle primären (nicht-Backup) Peers in der angegebenen Upstream-Gruppe.
Der Rückgabewert ist eine array-ähnliche Lua-Tabelle für alle primären Peers. Jeder Tabelleneintrag ist eine (verschachtelte) hash-ähnliche Lua-Tabelle, die die folgenden Schlüssel enthält:
- current_weight
- effective_weight
- fail_timeout
- fails
-
id
Identifikator (ID) für den Peer. Diese ID kann verwendet werden, um auf einen Peer in einer Gruppe in der Peer-modifizierenden API zu verweisen. * max_fails * name
Socket-Adresse für den aktuellen Peer * weight * accessed
Zeitstempel für den letzten Zugriff (in Sekunden seit der Epoche) * checked
Zeitstempel für die letzte Überprüfung (in Sekunden seit der Epoche) * down
Hält wahr, wenn der Peer als "down" markiert wurde, andernfalls ist dieser Schlüssel nicht vorhanden * conns
Anzahl der aktiven Verbindungen zum Peer (dies erfordert NGINX 1.9.0 oder höher).
get_backup_peers
syntax: peers = upstream.get_backup_peers(upstream_name)
Holen Sie sich die Konfigurationen für alle Backup-Peers in der angegebenen Upstream-Gruppe.
Der Rückgabewert hat die gleiche Struktur wie die Funktion get_primary_peers.
set_peer_down
syntax: ok, err = upstream.set_peer_down(upstream_name, is_backup, peer_id, down_value)
Setzen Sie das "down" (boolean) Attribut des angegebenen Peers.
Um einen Peer eindeutig zu spezifizieren, müssen Sie den Upstream-Namen, ob es sich um einen Backup-Peer handelt oder nicht, und die Peer-ID (beginnend bei 0) angeben.
Beachten Sie, dass diese Methode nur die Peer-Einstellungen im aktuellen Nginx-Worker-Prozess ändert. Sie müssen die Änderungen selbst über alle Nginx-Worker synchronisieren, wenn Sie eine serverweite Änderung wünschen (zum Beispiel durch die Verwendung von ngx_lua's ngx.shared.DICT).
Hier ist ein Beispiel. Angenommen, wir haben einen "bar" Upstream-Block in nginx.conf:
upstream bar {
server 127.0.0.2;
server 127.0.0.3 backup;
server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;
}
dann
upstream.set_peer_down("bar", false, 0, true)
wird den primären Peer, der server 127.0.0.2 entspricht, deaktivieren.
Ähnlich,
upstream.set_peer_down("bar", true, 1, true)
wird den Backup-Peer, der server 127.0.0.4 ... entspricht, deaktivieren.
Sie können einen Peer wieder aktivieren, indem Sie einen false-Wert als vierten Parameter angeben.
current_upstream_name
syntax: name = upstream.current_upstream_name()
Gibt den Namen des proxied Upstreams für die aktuelle Anfrage zurück. Wenn es keinen Upstream für diese Anfrage gibt (kein proxy_pass-Aufruf) oder diese Funktion in einer Phase vor der Inhaltsphase aufgerufen wird, ist der Rückgabewert nil. Wenn ein Port ausdrücklich in der Upstream-Definition oder der proxy_pass-Direktive enthalten ist, wird er im Rückgabewert dieser Funktion enthalten sein.
Beispiel:
-- upstream my_upstream { ... }
-- proxy_pass http://my_upstream;
upstream.current_upstream_name() --> my_upstream
-- proxy_pass http://example.com:1234;
upstream.current_upstream_name() --> example.com:1234
Beachten Sie, dass implizite Upstreams, die durch proxy_pass erstellt werden, enthalten sind, im Gegensatz zur Ausgabe von upstream.get_upstreams().
assuming your luajit is installed to /opt/luajit:
export LUAJIT_LIB=/opt/luajit/lib
assuming you are using LuaJIT v2.1:
export LUAJIT_INC=/opt/luajit/include/luajit-2.1
Hier gehen wir davon aus, dass Sie NGINX unter /opt/nginx/ installieren würden.
./configure --prefix=/opt/nginx \ --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" \ --add-module=/path/to/lua-nginx-module \ --add-module=/path/to/lua-upstream-nginx-module
make -j2 make install
Seit NGINX 1.9.11 können Sie dieses Modul auch als dynamisches Modul kompilieren, indem Sie die Option `--add-dynamic-module=PATH` anstelle von `--add-module=PATH` in der `./configure`-Befehlszeile oben verwenden. Und dann können Sie das Modul explizit in Ihrer `nginx.conf` über die [load_module](http://nginx.org/en/docs/ngx_core_module.html#load_module)-Direktive laden, zum Beispiel,
```nginx
load_module /path/to/modules/ngx_http_lua_upstream_module.so;
Siehe auch
- das ngx_lua-Modul: http://github.com/openresty/lua-nginx-module#readme
- die lua-resty-upstream-healthcheck Bibliothek, die die von diesem Modul bereitgestellte Lua-API nutzt.
GitHub
Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-lua-upstream.