Travis CI-Build-Details: Klicken Sie hier, um sie anzuzeigen
(中文版本请参看这里)
Health-Checker für Nginx-Upstream-Server (unterstützt http-Upstream und Stream-Upstream)
Dieses Modul kann NGINX mit der Funktion einer aktiven Back-End-Server-Zustandsprüfung ausstatten (unterstützt die Zustandsprüfung von vier und sieben Back-End-Servern).
Dieses Nginx-Modul befindet sich noch in der Entwicklung. Sie können dabei helfen, es zu verbessern.
Das Projekt ist auch in der Entwicklung weit fortgeschritten und Sie können gerne Code beisteuern oder Fehler melden. Gemeinsam, um es besser zu machen.
Wenn Sie Fragen haben, kontaktieren Sie mich bitte:
QQ
:373882405mail
: [email protected]Wenn Sie Nginx als Load Balancer verwenden, bietet Nginx nativ nur grundlegende Wiederholungsversuche, um den Zugriff auf einen normalen Backend-Server sicherzustellen.
Im Gegensatz dazu bietet dieses Nginx-Drittanbietermodul eine proaktive Zustandserkennung für Back-End-Server.
Es verwaltet eine Liste von Back-End-Servern, die garantieren, dass neue Anfragen direkt an einen fehlerfreien Back-End-Server gesendet werden.
Hauptmerkmale:
tcp
/ udp
/ http
http
/ fastcgi
html
/ json
/ csv
/ prometheus
html
/ json
/ csv
/ prometheus
check_http_expect_body ~ ".+OK.+";
git clone https://github.com/nginx/nginx.git
git clone https://github.com/zhouchangxun/ngx_healthcheck_module.git
cd nginx/;
git checkout branches/stable-1.12
git apply ../ngx_healthcheck_module/nginx_healthcheck_for_nginx_1.12+.patch
./auto/configure --with-stream --add-module=../ngx_healthcheck_module/
make && make install
Zurück zum Inhaltsverzeichnis
nginx.conf-Beispiel
user root;
worker_processes 1 ;
error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024 ;
}
http {
server {
listen 80 ;
# status interface
location /status {
healthcheck_status json;
}
# http front
location / {
proxy_pass http://http-cluster;
}
}
# as a backend server.
server {
listen 8080 ;
location / {
root html;
}
}
upstream http-cluster {
# simple round-robin
server 127.0.0.1:8080;
server 127.0.0.2:81;
check interval=3000 rise=2 fall=5 timeout=5000 type=http;
check_http_send "GET / HTTP/1.0rnrn" ;
check_http_expect_alive http_2xx http_3xx;
}
}
stream {
upstream tcp-cluster {
# simple round-robin
server 127.0.0.1:22;
server 192.168.0.2:22;
check interval=3000 rise=2 fall=5 timeout=5000 default_down=true type=tcp;
}
server {
listen 522 ;
proxy_pass tcp-cluster;
}
upstream udp-cluster {
# simple round-robin
server 127.0.0.1:53;
server 8.8.8.8:53;
check interval=3000 rise=2 fall=5 timeout=5000 default_down=true type=udp;
}
server {
listen 53 udp;
proxy_pass udp-cluster;
}
}
Statusschnittstelle
Eine typische Ausgabe ist (JSON-Format)
root @ changxun - PC : ~ / nginx - dev / ngx_healthcheck_module # curl localhost/status
{ "servers" : {
"total" : 6 ,
"generation" : 3 ,
"http" : [
{ "index" : 0 , "upstream" : "http-cluster" , "name" : "127.0.0.1:8080" , "status" : "up" , "rise" : 119 , "fall" : 0 , "type" : "http" , "port" : 0 },
{ "index" : 1 , "upstream" : "http-cluster" , "name" : "127.0.0.2:81" , "status" : "down" , "rise" : 0 , "fall" : 120 , "type" : "http" , "port" : 0 }
],
"stream" : [
{ "index" : 0 , "upstream" : "tcp-cluster" , "name" : "127.0.0.1:22" , "status" : "up" , "rise" : 22 , "fall" : 0 , "type" : "tcp" , "port" : 0 },
{ "index" : 1 , "upstream" : "tcp-cluster" , "name" : "192.168.0.2:22" , "status" : "down" , "rise" : 0 , "fall" : 7 , "type" : "tcp" , "port" : 0 },
{ "index" : 2 , "upstream" : "udp-cluster" , "name" : "127.0.0.1:53" , "status" : "down" , "rise" : 0 , "fall" : 120 , "type" : "udp" , "port" : 0 },
{ "index" : 3 , "upstream" : "udp-cluster" , "name" : "8.8.8.8:53" , "status" : "up" , "rise" : 3 , "fall" : 0 , "type" : "udp" , "port" : 0 }
]
}}
root @ changxun - PC : ~ / nginx - dev / ngx_healthcheck_module #
oder (Prometheus-Format)
root @ changxun - PC : ~ / nginx - dev / ngx_healthcheck_module # curl localhost/status
# HELP nginx_upstream_count_total Nginx total number of servers
# TYPE nginx_upstream_count_total gauge
nginx_upstream_count_total 6
# HELP nginx_upstream_count_up Nginx total number of servers that are UP
# TYPE nginx_upstream_count_up gauge
nginx_upstream_count_up 0
# HELP nginx_upstream_count_down Nginx total number of servers that are DOWN
# TYPE nginx_upstream_count_down gauge
nginx_upstream_count_down 6
# HELP nginx_upstream_count_generation Nginx generation
# TYPE nginx_upstream_count_generation gauge
nginx_upstream_count_generation 1
# HELP nginx_upstream_server_rise Nginx rise counter
# TYPE nginx_upstream_server_rise counter
nginx_upstream_server_rise { index = "0" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.1:8082" , status = "down" , type = "http" , port = "0" } 0
nginx_upstream_server_rise { index = "1" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.2:8082" , status = "down" , type = "http" , port = "0" } 0
nginx_upstream_server_rise { index = "1" , upstream_type = "stream" , upstream = "tcp-cluster" , name = "192.168.0.2:22" , status = "down" , type = "tcp" , port = "0" } 0
nginx_upstream_server_rise { index = "2" , upstream_type = "stream" , upstream = "udp-cluster" , name = "127.0.0.1:5432" , status = "down" , type = "udp" , port = "0" } 0
nginx_upstream_server_rise { index = "4" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.1:8082" , status = "down" , type = "http" , port = "0" } 0
nginx_upstream_server_rise { index = "5" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.2:8082" , status = "down" , type = "http" , port = "0" } 0
# HELP nginx_upstream_server_fall Nginx fall counter
# TYPE nginx_upstream_server_fall counter
nginx_upstream_server_fall { index = "0" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.1:8082" , status = "down" , type = "http" , port = "0" } 41
nginx_upstream_server_fall { index = "1" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.2:8082" , status = "down" , type = "http" , port = "0" } 42
nginx_upstream_server_fall { index = "1" , upstream_type = "stream" , upstream = "tcp-cluster" , name = "192.168.0.2:22" , status = "down" , type = "tcp" , port = "0" } 14
nginx_upstream_server_fall { index = "2" , upstream_type = "stream" , upstream = "udp-cluster" , name = "127.0.0.1:5432" , status = "down" , type = "udp" , port = "0" } 40
nginx_upstream_server_fall { index = "4" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.1:8082" , status = "down" , type = "http" , port = "0" } 40
nginx_upstream_server_fall { index = "5" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.2:8082" , status = "down" , type = "http" , port = "0" } 43
# HELP nginx_upstream_server_active Nginx active 1 for UP / 0 for DOWN
# TYPE nginx_upstream_server_active gauge
nginx_upstream_server_active { index = "0" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.1:8082" , type = "http" , port = "0" } 0
nginx_upstream_server_active { index = "1" , upstream_type = "http" , upstream = "http-cluster" , name = "127.0.0.2:8082" , type = "http" , port = "0" } 0
nginx_upstream_server_active { index = "1" , upstream_type = "stream" , upstream = "tcp-cluster" , name = "192.168.0.2:22" , type = "tcp" , port = "0" } 0
nginx_upstream_server_active { index = "2" , upstream_type = "stream" , upstream = "udp-cluster" , name = "127.0.0.1:5432" , type = "udp" , port = "0" } 0
nginx_upstream_server_active { index = "4" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.1:8082" , type = "http" , port = "0" } 0
nginx_upstream_server_active { index = "5" , upstream_type = "stream" , upstream = "http-cluster2" , name = "127.0.0.2:8082" , type = "http" , port = "0" } 0
root @ changxun - PC : ~ / nginx - dev / ngx_healthcheck_module #
Zurück zum Inhaltsverzeichnis
Syntax
Prüfintervall=Millisekunden [Fall=Anzahl] [Anstieg=Anzahl] [Timeout=Millisekunden] [default_down=true|false] [type=tcp|udp|http] [port=check_port]
Default
: Intervall=30000 Fall=5 Anstieg=2 Timeout=1000 default_down=true Typ=tcp
Context
: http/upstream || Stream/Upstream
Mit diesem Befehl kann die Back-End-Server-Zustandsprüfungsfunktion geöffnet werden.
Detail
interval
: Das Intervall des an das Backend gesendeten Gesundheitsprüfungspakets.fall
( fall_count
): Der Server gilt als ausgefallen, wenn die Anzahl aufeinanderfolgender Ausfälle fall_count erreicht.rise
( rise_count
): Der Server gilt als aktiv, wenn die Anzahl der aufeinanderfolgenden Erfolge den Rise_count erreicht.timeout
: Zeitüberschreitung für die Back-End-Integritätsanforderung.default_down
: Legen Sie den Anfangsstatus des Servers fest. Wenn dieser Wert wahr ist, bedeutet dies, dass der Standardwert „Down“ ist. Wenn er „False“ ist, bedeutet dies, dass er aktiv ist. Der Standardwert ist true. Dies bedeutet, dass der Server, der nicht verfügbar ist, darauf wartet, dass das Paket eine bestimmte Anzahl von Malen überprüft, bis der Zustand erfolgreich ist, und dann als fehlerfrei angesehen wird.type
: Typ des Gesundheitscheckpakets, unterstützt jetzt die folgenden Typentcp
: Einfache TCP-Verbindung. Wenn die Verbindung erfolgreich ist, wird das Back-End als normal angezeigt.udp
: Einfaches Senden von UDP-Paketen. Wenn Sie einen ICMP-Fehler erhalten (Host oder Port nicht erreichbar), wird die Back-End-Ausnahme angezeigt. (Im Stream-Konfigurationsblock wird nur die Überprüfung des UDP-Typs unterstützt.)http
: Senden Sie eine HTTP-Anfrage und ermitteln Sie anhand des Status des Back-End-Antwortpakets, ob das Back-End überlebt.Ein Beispiel wie folgt:
stream {
upstream tcp-cluster {
# simple round-robin
server 127.0.0.1:22;
server 192.168.0.2:22;
check interval=3000 rise=2 fall=5 timeout=5000 default_down=true type=tcp;
}
server {
listen 522 ;
proxy_pass tcp-cluster;
}
...
}
Syntax
: healthcheck_status [html|csv|json|prometheus]
Default
: healthcheck_status html
Context
: http/Server/Standort
Ein Beispiel wie folgt:
http {
server {
listen 80 ;
# status interface
location /status {
healthcheck_status;
}
...
}
Sie können das Standardanzeigeformat festlegen. Die Formate können html
, csv
oder json
sein. Der Standardtyp ist html
. Es unterstützt auch die Angabe des Formats durch das Anforderungsargument. Angenommen, Ihr check_status
Speicherort ist „/status“, dann kann das Argument format
das Format der Anzeigeseite ändern. Sie können so vorgehen:
/status?format=html
/status?format=csv
/status?format=json
/status?format=prometheus
Derzeit können Sie die Liste der Server mit demselben Status über das Argument status
abrufen. Zum Beispiel:
/status?format=json&status=down
/status?format=html&status=down
/status?format=csv&status=up
/status?format=prometheus&status=up
Zurück zum Inhaltsverzeichnis
Zurück zum Inhaltsverzeichnis
Bitte melden Sie Fehler
oder senden Sie Patches per
Zurück zum Inhaltsverzeichnis
Chance Chou (周长勋) [email protected].
Zurück zum Inhaltsverzeichnis
Der Health-Check-Teil basiert auf Yaoweibins Healthcheck-Modul nginx_upstream_check_module (http://github.com/yaoweibin/nginx_upstream_check_module);
Dieses Modul ist unter der BSD-Lizenz lizenziert.
Copyright (C) 2017-, von Changxun Zhou [email protected]
Copyright (C) 2014 von Weibin Yao [email protected]
Alle Rechte vorbehalten.
Die Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne Änderung, ist zulässig, sofern die folgenden Bedingungen erfüllt sind:
Bei der Weiterverbreitung des Quellcodes müssen der obige Urheberrechtshinweis, diese Liste der Bedingungen und der folgende Haftungsausschluss enthalten sein.
Bei Weitergaben in binärer Form müssen der obige Urheberrechtshinweis, diese Liste der Bedingungen und der folgende Haftungsausschluss in der Dokumentation und/oder anderen mit der Weitergabe bereitgestellten Materialien wiedergegeben werden.
DIESE SOFTWARE WIRD VON DEN COPYRIGHT-INHABERN UND MITARBEITERN „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT. JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNGEN, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF, STILLSCHWEIGENDE GEWÄHRLEISTUNGEN DER MARKTGÄNGIGKEIT UND EIGNUNG FÜR EINEN BESTIMMTEN ZWECK, WERDEN AUSGESCHLOSSEN. IN KEINEM FALL SIND DER COPYRIGHT-INHABER ODER MITARBEITER HAFTBAR FÜR DIREKTE, INDIREKTE, ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE BESCHAFFUNG VON ERSATZGÜTERN ODER -DIENSTLEISTUNGEN; VERLUSTE VON NUTZUNG, DATEN ODER GEWINNEN); ODER GESCHÄFTSUNTERBRECHUNG), JEDOCH URSACHE UND ÜBER JEGLICHE HAFTUNGSTHEORIE, SEI ES AUS VERTRAG, GEFAHRENHAFTUNG ODER AUS unerlaubter Handlung (EINSCHLIESSLICH FAHRLÄSSIGKEIT ODER ANDERWEITIG), DIE SICH IN IRGENDEINER WEISE AUS DER VERWENDUNG DIESER SOFTWARE ERGEBEN, SELBST WENN AUF DIE MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDE.
Zurück zum Inhaltsverzeichnis
Zurück zum Inhaltsverzeichnis