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;
}
}
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;
}
}
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]
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
default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
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
-
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
default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
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
-
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
- le nginx_upstream_check_module : https://github.com/alibaba/tengine/blob/master/src/http/ngx_http_upstream_check_module.c
- le patch du nginx_upstream_check_module : https://github.com/yaoweibin/nginx_upstream_check_module
- ou basé sur https://github.com/xiaokai-wang/nginx_upstream_check_module
dépendance de source
- Cjson : https://github.com/kbranigan/cJSON
- http-parser : https://github.com/nodejs/http-parser
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.