Aller au contenu

lua-upstream: API Lua pour le contrôle des upstreams NGINX

Installation

Vous pouvez installer ce module sur n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et 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

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_lua_upstream_module.so;

Ce document décrit nginx-module-lua-upstream v0.7 publié le 15 mai 2017.


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;

        # sortie d'exemple pour l'interface /upstream suivante :
        # 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("échec de l'obtention des serveurs dans l'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
            }
        }
    }
}

Fonctions

get_upstreams

syntax: names = upstream.get_upstreams()

Obtenez une liste des noms de tous les groupes d'upstream nommés (c'est-à-dire, les blocs upstream {} explicites).

Notez que les groupes d'upstream implicites créés par proxy_pass et autres sont exclus.

get_servers

syntax: servers = upstream.get_servers(upstream_name)

Obtenez les configurations pour tous les serveurs dans le groupe d'upstream spécifié. Veuillez noter qu'un serveur peut avoir plusieurs adresses lorsque son nom de serveur peut être résolu en plusieurs adresses.

La valeur de retour est une table Lua de type tableau. Chaque entrée de la table est une table Lua de type hash qui prend les clés suivantes :

  • addr

    adresse(s) socket. peut être soit une chaîne Lua, soit une table Lua de type tableau de chaînes Lua. * backup * fail_timeout * max_fails * name * weight

get_primary_peers

syntax: peers = upstream.get_primary_peers(upstream_name)

Obtenez les configurations pour tous les pairs principaux (non de secours) dans le groupe d'upstream spécifié.

La valeur de retour est une table Lua de type tableau pour tous les pairs principaux. Chaque entrée de la table est une table Lua de type hash (imbriquée) qui prend les clés suivantes :

  • current_weight
  • effective_weight
  • fail_timeout
  • fails
  • id

    Identifiant (ID) pour le pair. Cet ID peut être utilisé pour référencer un pair dans un groupe dans l'API de modification des pairs. * max_fails * name

    Adresse socket pour le pair actuel * weight * accessed

    Horodatage pour le dernier accès (en secondes depuis l'Époque) * checked

    Horodatage pour la dernière vérification (en secondes depuis l'Époque) * down

    Tient vrai si le pair a été marqué comme "down", sinon cette clé n'est pas présente * conns

    Nombre de connexions actives au pair (cela nécessite NGINX 1.9.0 ou supérieur).

get_backup_peers

syntax: peers = upstream.get_backup_peers(upstream_name)

Obtenez les configurations pour tous les pairs de secours dans le groupe d'upstream spécifié.

La valeur de retour a la même structure que la fonction get_primary_peers.

set_peer_down

syntax: ok, err = upstream.set_peer_down(upstream_name, is_backup, peer_id, down_value)

Définissez l'attribut "down" (booléen) du pair spécifié.

Pour spécifier de manière unique un pair, vous devez indiquer le nom de l'upstream, s'il s'agit ou non d'un pair de secours, et l'ID du pair (commençant à 0).

Notez que cette méthode ne change que les paramètres du pair dans le processus de travail Nginx actuel. Vous devez synchroniser les changements entre tous les travailleurs Nginx vous-même si vous souhaitez un changement à l'échelle du serveur (par exemple, par le biais de ngx_lua's ngx.shared.DICT).

Voici un exemple. Considérons que nous avons un bloc d'upstream "bar" dans 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;
}

alors

upstream.set_peer_down("bar", false, 0, true)

éteindra le pair principal correspondant à server 127.0.0.2.

De même,

upstream.set_peer_down("bar", true, 1, true)

éteindra le pair de secours correspondant à server 127.0.0.4 ....

Vous pouvez rallumer un pair en fournissant une valeur false comme 4ème argument.

current_upstream_name

syntax: name = upstream.current_upstream_name()

Renvoie le nom de l'upstream proxifié pour la requête actuelle. S'il n'y a pas d'upstream pour cette requête (pas d'appel proxy_pass), ou si cette fonction est appelée dans une phase antérieure à la phase de contenu, alors la valeur de retour sera nil. Si un port est explicitement inclus dans la définition de l'upstream ou la directive proxy_pass, il sera inclus dans la valeur de retour de cette fonction.

Exemple :

-- 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

Notez que les upstreams implicites créés par proxy_pass sont inclus, contrairement à la sortie de upstream.get_upstreams().

supposant que votre luajit est installé dans /opt/luajit :

export LUAJIT_LIB=/opt/luajit/lib

supposant que vous utilisez LuaJIT v2.1 :

export LUAJIT_INC=/opt/luajit/include/luajit-2.1

Ici, nous supposons que vous installeriez votre nginx sous /opt/nginx/.

./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

À partir de NGINX 1.9.11, vous pouvez également compiler ce module en tant que module dynamique, en utilisant l'option `--add-dynamic-module=PATH` au lieu de `--add-module=PATH` sur la
ligne de commande `./configure` ci-dessus. Et ensuite, vous pouvez charger explicitement le module dans votre `nginx.conf` via la directive [load_module](http://nginx.org/en/docs/ngx_core_module.html#load_module), par exemple,

```nginx
load_module /path/to/modules/ngx_http_lua_upstream_module.so;

Voir Aussi

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-lua-upstream.