stream-upsync: NGINX-Modul zum Synchronisieren von Stream-Backends von Consul oder etcd
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-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
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_stream_upsync_module.so;
Dieses Dokument beschreibt nginx-module-stream-upsync v1.2.2, veröffentlicht am 02. Januar 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;
}
}
HINWEIS: Der Befehl include für upstream ist notwendig, beim ersten Mal sollte die dump-Datei alle Server enthalten.
Beschreibung
Dieses Modul bietet eine Methode zur Entdeckung von Backend-Servern. Es unterstützt das dynamische Hinzufügen oder Löschen von Backend-Servern über Consul/etcd und das dynamische Anpassen des Gewichts der Backend-Server. Das Modul zieht rechtzeitig die neue Liste der Backend-Server von Consul/etcd, um den NGINX-IP-Router zu synchronisieren. NGINX muss nicht neu geladen werden. Es hat einige Vorteile gegenüber anderen:
-
zeitnah
Das Modul sendet den Schlüssel an Consul/etcd mit einem Index. Consul/etcd vergleicht diesen mit seinem Index. Wenn sich der Index nicht ändert, bleibt die Verbindung fünf Minuten bestehen. In dieser Zeit wird jede Operation am Schlüssel-Wert sofort zurückgemeldet.
-
Leistung
Das Abrufen von Consul/etcd entspricht einer Anfrage an NGINX. Das Aktualisieren des IP-Routers erfordert kein Neuladen von NGINX, sodass die Auswirkungen auf die Leistung von NGINX gering sind.
-
Stabilität
Selbst wenn ein Abruf fehlschlägt, wird der nächste upsync_interval abgerufen, sodass garantiert ist, dass der Backend-Server stabil Dienste bereitstellt. Zudem wird das Dumpen der neuesten Konfiguration an einen Speicherort unterstützt, sodass NGINX jederzeit neu geladen werden kann, selbst wenn Consul/etcd ausfällt.
Direktiven
upsync
syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=Sekunden/Minuten] [upsync_timeout=Sekunden/Minuten] [strong_dependency=off/on]
context: upstream
description: Ziehen Sie Upstream-Server von Consul/etcd... .
Die Bedeutungen der Parameter sind:
-
upsync_interval
Zeitintervall für das Abrufen von Servern von Consul/etcd.
-
upsync_timeout
Timeout für die Anfrage zum Abrufen von Servern von Consul/etcd.
-
upsync_type
Typ des Servers, von dem die Server abgerufen werden.
-
strong_dependency
Wenn NGINX gestartet wird und strong_dependency aktiviert ist, bedeutet dies, dass die Server von Consul/etcd abhängen und Server von Consul/etcd abgerufen werden.
upsync_dump_path
syntax: upsync_dump_path $path
default: /tmp/servers_$host.conf
context: upstream
description: Dumpen Sie die Upstream-Backends in den $path.
upsync_lb
syntax: upsync_lb $load_balance
default: round_robin/ip_hash/hash modula
context: upstream
description: Hauptsächlich für least_conn und konsistente Hashes, wenn Sie eines davon verwenden, müssen Sie upsync_lb angeben.
upsync_show
syntax: upsync_show
default: none
context: server
description: Zeigt alle Upstreams an.
curl http://localhost:2345/upstream_show
zeige alle Upstreams an
Consul_interface
Daten können aus dem Schlüssel/Wert-Speicher oder dem Dienstkatalog abgerufen werden. Im ersten Fall muss der Parameter upsync_type der Direktive consul sein. Zum Beispiel
upsync 127.0.0.1:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
Im zweiten Fall muss es consul_services sein.
upsync 127.0.0.1:8500/v1/catalog/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;
Sie können Backend-Server über consul_ui oder http_interface hinzufügen oder löschen. Nachfolgend Beispiele für den Schlüssel/Wert-Speicher.
http_interface Beispiel:
- hinzufügen
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
oder
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
-
löschen
curl -X DELETE http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port -
gewicht-anpassen
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 oder 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 -
Server-Down markieren
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 oder 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 -
überprüfen
curl http://$consul_ip:$port/v1/kv/upstreams/$upstream_name?recurse
Etcd_interface
Sie können Backend-Server über http_interface hinzufügen oder löschen.
Hauptsächlich wie etcd, http_interface Beispiel:
- hinzufügen
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
-
löschen
curl -X DELETE http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port -
gewicht-anpassen
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 -
Server-Down markieren
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 -
überprüfen
curl http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name
Code-Stil
Der Code-Stil basiert hauptsächlich auf style
Siehe auch
- das nginx_upstream_check_module: https://github.com/alibaba/tengine/blob/master/src/http/ngx_http_upstream_check_module.c
- der nginx_upstream_check_module Patch: https://github.com/yaoweibin/nginx_upstream_check_module
- oder basierend auf https://github.com/xiaokai-wang/nginx_upstream_check_module
Quellabhängigkeit
- Cjson: https://github.com/kbranigan/cJSON
- http-parser: https://github.com/nodejs/http-parser
GitHub
Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-stream-upsync.