Im Internet gibt es viele Einführungen zu nginx. Hier werden wir darüber sprechen, wie Upstream-Dienste (wie der Java1-Dienst in der folgenden Abbildung) über nginx ohne „Gateway“ dynamisch online und offline gebracht werden können. Der traditionelle Ansatz besteht darin, die Upstream-Datei von nginx manuell zu ändern, die Java1-Konfiguration auszukommentieren oder als inaktiv zu markieren und dann nginx neu zu laden, damit die Änderung wirksam wird. Natürlich können Sie ein Skript erstellen, um die Änderung zu automatisieren. Bei einem stark ausgelasteten Nginx führt ein hastiges Neuladen jedoch im besten Fall zu einer langsamen Reaktion oder im schlimmsten Fall zu einem enormen Datenverlust. Wie kann Nginx also die Upstream-Konfiguration dynamisch laden? Im Allgemeinen gibt es online drei Lösungen:
Für eine laufende Produktionsumgebung mit Nginx ist die dritte Option zweifellos die kostengünstigste. Schauen wir uns das genauer an: Technische Lösung: nginx1.16+nginx_upstream_check_module+nginx-upsync-module+consul veranschaulichen:
Im Folgenden werden die Implementierungsdetails nacheinander anhand von drei Aspekten erläutert: Consul-Clusterbereitstellung, Nginx-Transformation und Erstellen von Upstream-Daten. 1. Konsul-Cluster bereitstellenOffizielle Website: https://www.consul.io/ Angenommen, ein Consul-Cluster besteht aus den folgenden drei Maschinen: 192.168.21.11 192.168.21.12 192.168.21.13 192.168.21.14 # Diese IP ist die Proxy-IP, die zum Proxy der oben genannten 3 Maschinen verwendet wird 1. VorbereitungLaden Sie das komprimierte Consul-Paket von der offiziellen Website herunter und laden Sie es jeweils auf die oben genannten drei Server hoch. Die Consul-Version hier ist 1.8.4: entpacken Sie consul_1.8.4_linux_amd64.zip mv consul /usr/local/bin/ [root@nginx-11 tmp]# Konsul Verwendung: consul [--version] [--help] <Befehl> [<Argumente>] Verfügbare Befehle sind: acl Interagieren Sie mit den ACLs von Consul agent Betreibt einen Consul-Agenten Interagieren Sie mit dem Katalog .... Erstellen Sie auf den drei Computern jeweils Konsuldaten-, Protokoll- und Konfigurationsdateiverzeichnisse: mkdir -p /Daten/Consul/{Daten,Protokoll} mkdir /etc/consul 2. Generieren Sie eine Konsul-Konfigurationsdatei Im Folgenden wird die Konfigurationsdatei von 192.168.21.11 als Beispiel verwendet: [root@nginx-11 tmp]# cat /etc/consul/config.json { "Datencenter": "dc1", "primäres_Rechenzentrum": "dc1", "bootstrap_expect":3, "start_join":[ "192.168.21.11", "192.168.21.12", „192.168.21.13“ ], "erneut versuchen beizutreten":[ "192.168.21.11", "192.168.21.12", „192.168.21.13“ ], "advertise_addr": "192.168.21.11", "bind_addr": "192.168.21.11", "client_addr": "0.0.0.0", "Server":true, "verbinden":{ "aktiviert":true }, "Knotenname": "192.168.21.11", "ui": wahr, "Datenverzeichnis": "/data/consul/data", "enable_script_checks":false, "enable_local_script_checks":wahr, "Protokolldatei": "/data/consul/log/", "log_level":"Informationen", "log_rotate_bytes":100000000, "log_rotate_duration":"24h", "verschlüsseln":"a2zC4ItisuFdpl7IqwoYz3GqwA5W1w2CxjNmyVbuhZ4=", "acl": { "aktiviert":true, "Standardrichtlinie": "Verweigern", "enable_token_persistence":wahr, "enable_key_list_policy":true, "Token": { "Meister":"6c95012f-d086-4ef3-b6b9-35b60f529bd0" } } } veranschaulichen:
3. Erstellen Sie einen Konsul-ClusterStarten Sie Consul einfach jeweils auf drei Maschinen: Konsul-Agent -Konfigurationsdatei=/etc/consul/config.json & Sie können auf die Consul-Hintergrundschnittstelle zugreifen, indem Sie über den Browser http://192.168.21.14:8500 (oder einen beliebigen IP:Port) aufrufen und den Token-Wert des obigen Masters eingeben, um den spezifischen Inhalt anzuzeigen. Beachten:
4. Erstellen Sie Konsul-Zugriffsberechtigungen für Nicht-Administratoren1) Erstellen Sie eine Zugriffsrichtlinie Greifen Sie über den Browser auf Consul zu, klicken Sie oben rechts auf ACL -> Zugriffskontrollen -> Richtlinien -> Erstellen, um eine schreibgeschützte „Upstreams“-KV-Richtlinie mit dem Namen „readonlykv“ zu erstellen. Der Regelinhalt lautet: Schlüsselpräfix "Upstreams/" { Richtlinie = "Liste" } Erstellen Sie eine KV-Richtlinie, die „Upstreams“ schreiben kann, mit dem Namen: writekv. Der Regelinhalt lautet: Schlüsselpräfix "Upstreams/" { Richtlinie = "schreiben" } Die Screenshots der beiden erstellten Strategien sind wie folgt: 2) Erstellen Sie einen Zugriffstoken Fügen Sie dem anonymen Benutzertoken den Zugriff auf die schreibgeschützte KV-Richtlinie „Upstreams“ hinzu, um dem Nginx-Modul das anonyme Lesen der Consul-Konfiguration zu ermöglichen: An diesem Punkt ist die Bereitstellung des Consul-Clusters abgeschlossen. 2. Nginx-Transformation1. Upgrade von nginxLaden Sie nginx-bezogene Module herunter: nginx-upsync-Modul: https://github.com/weibocom/nginx-upsync-module nginx_upstream_check_module: https://github.com/xiaokai-wang/nginx_upstream_check_module Beachten:
1) Patch nginx_upstream_check_module cd nginx-1.16.0 patch -p1 < /usr/local/src/nginx-1.16/nginx_upstream_check_module-master/check_1.12.1+.patch Hinweis: Ich habe die beiden heruntergeladenen Quellpakete des Nginx-Moduls im Pfad /usr/local/src/nginx-1.16/ abgelegt. 2) Kompilieren Sie nginx ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/nginx-1.16/nginx_upstream_check_module-master --add-module=/usr/local/src/nginx-1.16/nginx-upsync-module-master … veranschaulichen: Ich habe nginx unter /usr/local/ installiert; Die Auslassungspunkte nach dem Befehl sind die Module, die Sie installieren möchten. Bitte fügen Sie sie entsprechend der tatsächlichen Situation hinzu. Sie können über nginx -V sehen, welche Module derzeit installiert sind, und sie dann hinzufügen. 3) Installieren Sie nginx machen # Wenn es sich um ein reibungsloses Upgrade handelt, führen Sie in diesem Schritt „make install“ nicht aus 4) Aktualisieren Sie nginx #Sichern Sie die Nginx-Binärdatei erneut mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx16.old #Ersetzen Sie die alte Nginx-Binärdatei durch die neue cp objs/nginx /usr/local/nginx/sbin/ #Zeigen Sie das installierte Nginx-Modul /usr/local/nginx/sbin/nginx -V Erinnerung: Nach dem Testen wurde festgestellt, dass der alte Nginx-Prozess nicht beendet wird, wenn nginx1.6 neu geladen oder der Befehl kill -USR2 gesendet wird. Nginx muss neu gestartet werden, damit die Änderungen wirksam werden. Ich weiß nicht, ob es sich um einen Fehler handelt. /usr/local/nginx/sbin/nginx -s stoppen #Wenn der alte Nginx-Prozess nicht gestartet wurde, erzwingen Sie mit kill -9 die Beendigung. ps -ef |grep nginx #Öffnen Sie nginx /usr/local/nginx/sbin/nginx # Beschreibung: Senden Sie den Befehl kill -USR2 kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` An diesem Punkt ist das Nginx-Upgrade abgeschlossen. 2. Konfigurieren Sie nginx1) Konfigurieren Sie zunächst die Nginx-Anzeigeseite, um den Ausführungsstatus von Nginx schnell zu verstehen Katze nginx.conf Server { hören Sie 80; Servername localhost; # Upstream in Server 80 anzeigen, was der globalen Konfiguration entspricht. Für andere Konfigurationsdateien ist keine Konfiguration erforderlich. # Browserzugriff http://nginx-ip:80/upstream_show, um die spezifischen Konfigurationsinformationen von nginx Upstream location = /upstream_show { anzuzeigen. upstream_show; } # Zeigt die Prüfdetails auf Server 80 an, was der globalen Konfiguration entspricht. Andere Konfigurationsdateien müssen nicht konfiguriert werden. # Browserzugriff http://nginx-ip:80/status, um den Integritätsstatus des Upstream-Dienstes anzuzeigen. Rot bedeutet, dass ein Problem vorliegt, und Weiß bedeutet, dass der Standort /status { normal ist. Status prüfen; } # Zeigt den Status von nginx auf Server 80 an, was der globalen Konfiguration entspricht. Andere Konfigurationsdateien müssen nicht konfiguriert werden. # nginx nativer Funktionsspeicherort /NginxStatus { stub_status ein; Zugriff_Abmeldung; erlaube 192.168.0.0/16; alles leugnen; } } # Spezifische Serverkonfiguration einführen. Jeder Server muss das Modul nginx-upsync-module konfigurieren. Die Modulkonfiguration umfasst /usr/local/nginx/conf/vhosts/*.conf; 2) Serverkonfiguration HTTP-Methodenerkennung Upstream rs1 { Server 127.0.0.1:11111; upsync 192.168.21.14:8500/v1/kv/upstreams/rs1/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=aus; upsync_dump_path /usr/local/nginx/conf/servers/servers_rs1.conf; Prüfintervall=1000 Anstieg=2 Abfall=2 Timeout=3000 Typ=http Standard_Abstieg=false; check_http_send "HEAD /health.htm HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } Server { hören Sie 80; ... TCP-Erkennung (TCP ist die Standarderkennungsmethode) Upstream rs2 { Server 127.0.0.1:11111; upsync 192.168.21.14:8500/v1/kv/upstreams/rs2/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=aus; upsync_dump_path /usr/local/nginx/conf/servers/servers_rs2.conf; Prüfintervall=1000 Anstieg=2 Abfall=2 Timeout=3000 Typ=TCP Standard_Down=False; } Server { hören Sie 80; ... veranschaulichen:
An diesem Punkt ist die Änderung der Nginx-Konfiguration abgeschlossen. 3. Erstellen Sie Upstream-Daten (Consul-Schlüssel-Wert-Paare)Sie können Upstream-Daten über Webseiten oder Skripte wie folgt erstellen: 1. Betrieb der WebseiteWenn Sie ein Verzeichnis erstellen müssen, fügen Sie nach dem zu erstellenden Feld "/" hinzu, z. B.: upstreams/. Unter „Key/Value“ müssen Sie zunächst das Verzeichnis „upstreams“ (mit dem Buchstaben s am Ende) anlegen und anschließend den entsprechenden Servernamen vergeben. Der Screenshot sieht wie folgt aus: 2. BefehlszeilenoperationWenn Sie die Kommandozeile verwenden, müssen Sie das Verzeichnis „upstreams/“ nicht erst anlegen. Das Verzeichnis und die Serverdaten werden vom Befehl automatisch angelegt. Im Folgenden wird der Upstream-Dienst Java1 (IP ist 192.168.20.100, Portnummer ist 8080, Upstream-Gruppenname ist rs1) als Beispiel verwendet: Hinzufügen eines Datensatzes curl -X PUT http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token Nachdem der obige Befehl ausgeführt wurde, werden die Standardkonfigurationsinformationen für den Upstream von Nginx erstellt, und zwar: Server 192.168.20.100:8080 Gewicht=1 max_fails=2 Fail_Timeout=10s; Sie können Gewichte und andere Werte mit dem folgenden Befehl anpassen: curl -X PUT -d "{\"Gewicht\":100, \"max_fails\":2, \"fail_timeout\":10}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token # oder curl -X PUT -d '{"weight":100, "max_fails":2, "fail_timeout":10}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token Löschen von Datensätzen curl -X LÖSCHEN http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token Gewichte aktualisieren curl -X PUT -d "{\"Gewicht\":100, \"max_fails\":2, \"fail_timeout\":10}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token # oder curl -X PUT -d '{"weight":100, "max_fails":2, "fail_timeout":10}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token Offline-Dienst curl -X PUT -d "{\"Gewicht\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token # oder curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token Überprüfen Sie, welche Upstream-Server sich unter Upstream rs1 befinden curl http://192.168.21.14:8500/v1/kv/upstreams/rs1?recurse Es wird empfohlen, Befehlszeilenoperationen zu verwenden und die Befehlszeilen in Skripten zusammenzustellen, um DevOps zu implementieren 4. Einige ErkenntnisseWährend der Transformation der dynamischen Erkennungslösung stieß ich auf viele Probleme. Das schwierigste war, dass nginx in der Testumgebung ständig Fehler meldete und die Upstream-Daten nicht vollständig heruntergeladen werden konnten. Nach verschiedenen Untersuchungen wurden keine Probleme gefunden. Zwischendurch vermutete ich, dass es ein Problem mit Consul war. Ich wechselte zu etcd, meldete aber immer noch denselben Fehler. Schließlich stellte ich durch Paketerfassung und -verfolgung fest, dass die Linux-Kernelparameter falsch konfiguriert waren, was zu einem Warteschlangenüberlauf und einem Fehler beim TCP-Dreiwege-Handshake führte, was die Kommunikation zwischen nginx und Consul beeinträchtigte. Theoretisch sind viele Lösungen gut und manche Leute haben sie sogar erfolgreich eingesetzt. Wenn Sie sie jedoch tatsächlich selbst implementieren, werden Sie immer noch auf verschiedene Probleme stoßen, von denen einige sogar tödlich sind. Zu diesem Zeitpunkt müssen Sie sie geduldig lösen. Ich hoffe, dass jeder, der diesen Artikel sieht, es ausprobiert. Wenn Sie auf Probleme stoßen, beruhigen Sie sich bitte und beheben Sie geduldig das Problem. Außerdem sagen viele Leute, dass Betrieb und Wartung keinen Wert schaffen. Ich denke, das ist falsch. Es gibt viele Werte, die Betrieb und Wartung widerspiegeln müssen, und SRE ist einer davon. Damit ist dieser Artikel über die dynamische und automatische Online- und Offline-Anmeldung von Upstream-Servern ohne Neuladen auf Basis von nginx abgeschlossen. Weitere Informationen zur automatischen Online-Anmeldung von Upstream-Servern mit nginx finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: So schreiben Sie schönen HTML-Code
1. Wichtige Punkte für die frühzeitige Planung de...
Inhaltsverzeichnis 1. Herunterladen 2. Bereitstel...
Ich möchte einen Artikel von Zhang Xinxu zitieren...
In diesem Artikel wird der spezifische Code für J...
Anwendung von HTML und CSS in Flash: Ich habe zufä...
[Lösung 1: Padding-Implementierung] Prinzip: Wenn...
Windows 10 unterstützt jetzt das Linux-Subsystem....
Inhaltsverzeichnis 1. Einleitung 2. Passen Sie de...
Inhaltsverzeichnis Anforderung: Abfrage laufender...
UCenter Home ist ein von Comsenz veröffentlichtes ...
<br />In einem Jahr Bloggen habe ich persönl...
Hier ist eine kurze Einführung in Indizes: Der Zw...
Vorwort Im vorherigen Artikel wurde Hadoop instal...
more ist eines unserer am häufigsten verwendeten ...
In diesem Artikelbeispiel wird der spezifische Co...