Détails de la construction de Travis CI : Cliquez pour voir
(中文版本请参看这里)
Vérificateur de santé pour les serveurs en amont Nginx (prise en charge http en amont et& stream en amont)
Ce module peut fournir à NGINX la capacité de vérification active de l'état du serveur back-end (prend en charge la vérification de l'état de quatre et sept serveurs back-end).
Ce module nginx est toujours en cours de développement, vous pouvez nous aider à l'améliorer.
Le projet est également bien développé en développement, et vous êtes invités à contribuer au code ou à signaler des bogues. Ensemble pour le rendre meilleur.
Si vous avez des questions, veuillez me contacter :
QQ
:373882405mail
: [email protected]Lorsque vous utilisez nginx comme équilibreur de charge, nginx ne fournit nativement que des tentatives de base pour garantir l'accès à un serveur backend normal.
En revanche, ce module tiers nginx fournit une détection proactive de l’état de santé pour les serveurs back-end.
Il maintient une liste de serveurs back-end qui garantissent que les nouvelles requêtes sont envoyées directement à un serveur back-end sain.
Principales caractéristiques :
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
Retour à la table des matières
exemple nginx.conf
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;
}
}
interface d'état
Une sortie typique est (format json)
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 #
ou (format Prométhée)
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 #
Retour à la table des matières
Syntax
check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|udp|http] [port=check_port]
Default
: intervalle=30000 chute=5 montée=2 timeout=1000 default_down=true type=tcp
Context
: http/amont || flux/amont
Cette commande peut ouvrir la fonction de vérification de l’état du serveur principal.
Detail
interval
: l'intervalle du paquet de contrôle de santé envoyé au backend.fall
( fall_count
) : le serveur est considéré comme down si le nombre de pannes consécutives atteint fall_count.rise
( rise_count
) : le serveur est considéré comme up si le nombre de succès consécutifs atteint Rise_count.timeout
: délai d'attente pour la demande d'intégrité du back-end.default_down
: définit l'état initial du serveur, si c'est vrai, cela signifie que la valeur par défaut est down, si elle est false, est up. La valeur par défaut est true, qui correspond au début du serveur qui n'est pas disponible, pour attendre que le package de vérification de l'état atteigne un certain nombre de fois après que le succès soit considéré comme sain.type
: type de pack de contrôle de santé, prend désormais en charge les types suivantstcp
: connexion TCP simple, si la connexion réussit, elle affiche le back-end normal.udp
: simple à envoyer des paquets udp, si vous recevez une erreur icmp (hôte ou port inaccessible), il affiche l'exception back-end. (Seule la vérification de type UDP est prise en charge dans le bloc de configuration du flux)http
: envoie une requête HTTP, par l'état du paquet de réponse back-end pour déterminer si le back-end survit.Un exemple comme suit :
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/serveur/emplacement
Un exemple comme suit :
http {
server {
listen 80 ;
# status interface
location /status {
healthcheck_status;
}
...
}
Vous pouvez spécifier le format d'affichage par défaut. Les formats peuvent être html
, csv
ou json
. Le type par défaut est html
. Il prend également en charge la spécification du format par l'argument de requête. Supposons que votre emplacement check_status
soit '/status', l'argument de format
peut changer le format de la page d'affichage. Vous pouvez faire comme ceci :
/statut?format=html
/statut?format=csv
/statut?format=json
/status?format=prométhée
À l'heure actuelle, vous pouvez récupérer la liste des serveurs ayant le même statut par l'argument de status
. Par exemple:
/status?format=json&status=down
/status?format=html&status=down
/status?format=csv&status=haut
/status?format=prométhée&status=up
Retour à la table des matières
Retour à la table des matières
Veuillez signaler les bugs
ou soumettez des correctifs par
Retour à la table des matières
Chance Chou (周长勋) [email protected].
Retour à la table des matières
La partie vérification de l'état est basée sur le module de vérification de l'état de Yaoweibin nginx_upstream_check_module (http://github.com/yaoweibin/nginx_upstream_check_module) ;
Ce module est sous licence BSD.
Copyright (C) 2017-, par Changxun Zhou [email protected]
Copyright (C) 2014 par Weibin Yao [email protected]
Tous droits réservés.
La redistribution et l'utilisation sous forme source et binaire, avec ou sans modification, sont autorisées à condition que les conditions suivantes soient remplies :
Les redistributions du code source doivent conserver l'avis de droit d'auteur ci-dessus, cette liste de conditions et la clause de non-responsabilité suivante.
Les redistributions sous forme binaire doivent reproduire l'avis de droit d'auteur ci-dessus, cette liste de conditions et la clause de non-responsabilité suivante dans la documentation et/ou tout autre matériel fourni avec la distribution.
CE LOGICIEL EST FOURNI PAR LES TITULAIRES DES DROITS D'AUTEUR ET LES CONTRIBUTEURS « EN L'ÉTAT » ET TOUTE GARANTIE EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS LIMITATION, LES GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D'ADAPTATION À UN USAGE PARTICULIER EST DÉCLINÉE. EN AUCUN CAS LE TITULAIRE DES DROITS D'AUTEUR OU LES CONTRIBUTEURS NE SERONT RESPONSABLES DE TOUT DOMMAGE DIRECT, INDIRECT, ACCESSOIRE, SPÉCIAL, EXEMPLAIRE OU CONSÉCUTIF (Y COMPRIS, MAIS SANS LIMITATION, L'ACHAT DE BIENS OU DE SERVICES DE SUBSTITUTION ; LA PERTE D'UTILISATION, DE DONNÉES OU DE PROFITS ; OU INTERRUPTION DES ACTIVITÉS) QUELLE QUE CE SOIT LA CAUSE ET SUR TOUTE THÉORIE DE RESPONSABILITÉ, QU'ELLE SOIT CONTRACTUELLE, STRICTE OU DÉLIT (Y COMPRIS LA NÉGLIGENCE OU AUTRE) DÉCOULANT DE QUELQUE MANIÈRE QUE CE SOIT DE L'UTILISATION DE CE LOGICIEL, MÊME SI INFORMÉ DE LA POSSIBILITÉ DE TELS DOMMAGES.
Retour à la table des matières
Retour à la table des matières