Aller au contenu

stream-upsync: module NGINX pour synchroniser les backends de flux depuis consul ou etcd

Installation

Vous pouvez installer ce module dans toute 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-stream-upsync
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-stream-upsync

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

load_module modules/ngx_stream_upsync_module.so;

Ce document décrit nginx-module-stream-upsync v1.2.2 publié le 02 janvier 2020.


nginx-consul:

stream {
    upstream test {
        upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;

        include /usr/local/nginx/conf/servers/servers_test.conf;
    }

    upstream bar {
        server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
    }

    server {
        listen 12345;

        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass test;
    }

    server {
        listen 2345;

        upstream_show
    }

    server {
        listen 127.0.0.1:9091;

        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass bar;
    }
}
nginx-etcd:
stream {
    upstream test {
        upsync 127.0.0.1:2379/v2/keys/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=etcd strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;

        include /usr/local/nginx/conf/servers/servers_test.conf;
    }

    upstream bar {
        server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
    }

    server {
        listen 12345;

        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass test;
    }

    server {
        listen 2345;

        upstream_show
    }

    server {
        listen 127.0.0.1:9091;

        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass bar;
    }
}
upsync_lb:
stream {
    upstream test {
        least_conn; //hash $uri consistent;

        upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
        upsync_lb least_conn; //hash_ketama;

        include /usr/local/nginx/conf/servers/servers_test.conf;
    }

    upstream bar {
        server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
    }

    server {
        listen 12345;

        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass test;
    }

    server {
        listen 2345;

        upstream_show
    }

    server {
        listen 127.0.0.1:9091;

        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass bar;
    }
}

NOTE : la commande include pour upstream est nécessaire, la première fois le fichier dumpé doit inclure tous les serveurs.

Description

Ce module fournit une méthode pour découvrir les serveurs backend. Il prend en charge l'ajout ou la suppression dynamique de serveurs backend via consul/etcd et l'ajustement dynamique du poids des serveurs backend. Le module tirera rapidement la nouvelle liste de serveurs backend de consul/etcd pour synchroniser le routeur IP NGINX. NGINX n'a pas besoin d'être rechargé. Il présente certains avantages par rapport aux autres :

  • rapide

    Le module envoie une clé à consul/etcd avec un index, consul/etcd le comparera avec son index. Si l'index ne change pas, la connexion restera suspendue pendant cinq minutes. Pendant cette période, toute opération sur la clé-valeur sera immédiatement renvoyée.

  • performance

    Tirer des données de consul/etcd équivaut à une requête à NGINX, la mise à jour du routeur IP NGINX n'a pas besoin de rechargement, donc l'impact sur la performance de NGINX est faible.

  • stabilité

    Même si un tirage échoue, il tirera au prochain upsync_interval, garantissant ainsi que le serveur backend fournit un service de manière stable. Et prend en charge le dumping de la dernière configuration à un emplacement, donc même si consul/etcd est suspendu, NGINX peut être rechargé à tout moment.

Directives

upsync

syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=second/minutes] [upsync_timeout=second/minutes] [strong_dependency=off/on]
default: none, si les paramètres sont omis, les paramètres par défaut sont upsync_interval=5s upsync_timeout=6m strong_dependency=off

context: upstream

description: Tirer des serveurs en amont de consul/etcd... .

Les significations des paramètres sont :

  • upsync_interval

    temps d'intervalle pour tirer des serveurs de consul/etcd.

  • upsync_timeout

    délai d'attente pour la requête de tirage des serveurs de consul/etcd.

  • upsync_type

    type de serveur à tirer depuis le serveur de configuration.

  • strong_dependency

    lorsque NGINX démarre, si strong_dependency est activé, cela signifie que les serveurs dépendront de consul/etcd et tireront les serveurs de consul/etcd.

upsync_dump_path

syntax: upsync_dump_path $path

default: /tmp/servers_$host.conf

context: upstream

description: dump les backends en amont vers le $path.

upsync_lb

syntax: upsync_lb $load_balance

default: round_robin/ip_hash/hash modula

context: upstream

description: principalement pour least_conn et hash consistent, lorsque vous utilisez l'un d'eux, vous devez indiquer l'utilisation de upsync_lb.

upsync_show

syntax: upsync_show

default: none

context: server

description: afficher tous les upstreams.

curl http://localhost:2345/upstream_show

afficher tous les upstreams

Consul_interface

Les données peuvent être prises à partir du magasin clé/valeur ou du catalogue de services. Dans le premier cas, le paramètre upsync_type de la directive doit être consul. Par exemple

    upsync 127.0.0.1:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;

Dans le second cas, il doit être consul_services.

    upsync 127.0.0.1:8500/v1/catalog/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;

Vous pouvez ajouter ou supprimer des serveurs backend via consul_ui ou http_interface. Voici des exemples pour le magasin clé/valeur.

Exemple http_interface :

  • ajouter
        curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
    
    default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;

    curl -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
ou
    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
la valeur prend en charge le format json.

  • supprimer

        curl -X DELETE http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
    

  • ajuster-le-poids

        curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
    ou
        curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
    

  • marquer le serveur comme hors service

        curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
    ou
        curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
    

  • vérifier

        curl http://$consul_ip:$port/v1/kv/upstreams/$upstream_name?recurse
    

Etcd_interface

Vous pouvez ajouter ou supprimer des serveurs backend via http_interface.

Principalement comme etcd, exemple http_interface :

  • ajouter
        curl -X PUT http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
    
    default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;

    curl -X PUT -d value="{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port
la valeur prend en charge le format json.

  • supprimer

        curl -X DELETE http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
    

  • ajuster-le-poids

        curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port
    

  • marquer le serveur comme hors service

        curl -X PUT -d value="{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port
    

  • vérifier

        curl http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name
    

Style de code

Le style de code est principalement basé sur style

voir aussi

dépendance de source

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-stream-upsync.