Zum Inhalt

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

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-lua-upstream.