Detalles de compilación de Travis CI: haga clic para ver
(中文版本请参看这里)
Comprobador de estado para servidores ascendentes de Nginx (compatible con http ascendente y flujo ascendente)
Este módulo puede proporcionar a NGINX la capacidad de realizar una verificación activa del estado del servidor back-end (admite la verificación del estado de cuatro y siete servidores back-end).
Este módulo nginx aún está en desarrollo, usted puede ayudar a mejorarlo.
El proyecto también está bien desarrollado y puede contribuir con código o informar errores. Juntos para hacerlo mejor.
Si tiene alguna pregunta, por favor contácteme:
QQ
: 373882405mail
: [email protected]Cuando utiliza nginx como equilibrador de carga, nginx proporciona de forma nativa solo reintentos básicos para garantizar el acceso a un servidor backend normal.
Por el contrario, este módulo de terceros de nginx proporciona detección proactiva del estado de salud para servidores back-end.
Mantiene una lista de servidores back-end que garantizan que las nuevas solicitudes se envíen directamente a un servidor back-end en buen estado.
Características clave:
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
Volver al índice
Ejemplo de 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;
}
}
interfaz de estado
Una salida típica es (formato 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 #
o (formato prometeus)
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 #
Volver al índice
Syntax
intervalo de verificación=milisegundos [caída=recuento] [subida=recuento] [tiempo de espera=milisegundos] [default_down=true|false] [tipo=tcp|udp|http] [puerto=check_port]
Default
: intervalo=30000 caída=5 aumento=2 tiempo de espera=1000 default_down=true type=tcp
Context
: http/upstream || corriente/aguas arriba
Este comando puede abrir la función de verificación del estado del servidor back-end.
Detail
interval
: el intervalo del paquete de verificación de estado enviado al backend.fall
( fall_count
): el servidor se considera inactivo si el número de fallas consecutivas alcanza fall_count.rise
( rise_count
): el servidor se considera activo si el número de éxitos consecutivos alcanza rise_count.timeout
: tiempo de espera para la solicitud de estado de back-end.default_down
: establece el estado inicial del servidor, si es verdadero, significa que el valor predeterminado está inactivo, si es falso, está activo. El valor predeterminado es verdadero, que es el comienzo del servidor que no está disponible, esperar hasta que el paquete de verificación de estado alcance un cierto número de veces después de que el éxito se considere saludable.type
: tipo de paquete de verificación de estado, ahora admite los siguientes tipostcp
: conexión tcp simple, si la conexión es exitosa, muestra el back-end normal.udp
: fácil de enviar paquetes udp, si recibe un error de icmp (host o puerto inalcanzable), muestra la excepción de back-end. (Solo se admite la verificación de tipo UDP en el bloque de configuración de transmisión)http
: envía una solicitud HTTP y determina si el back-end sobrevive a través del estado del paquete de respuesta del back-end.Un ejemplo como sigue:
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/servidor/ubicación
Un ejemplo como sigue:
http {
server {
listen 80 ;
# status interface
location /status {
healthcheck_status;
}
...
}
Puede especificar el formato de visualización predeterminado. Los formatos pueden ser html
, csv
o json
. El tipo predeterminado es html
. También admite especificar el formato mediante el argumento de la solicitud. Supongamos que su ubicación check_status
es '/status', el argumento de format
puede cambiar el formato de la página de visualización. Puedes hacer así:
/estado?formato=html
/estado?formato=csv
/estado?formato=json
/status?format=prometeo
Actualmente, puede obtener la lista de servidores con el mismo estado mediante el argumento status
. Por ejemplo:
/status?format=json&status=abajo
/status?format=html&status=abajo
/status?format=csv&status=arriba
/status?format=prometheus&status=arriba
Volver al índice
Volver al índice
Por favor informe errores
o enviar parches por
Volver al índice
Chance Chou (周长勋) [email protected].
Volver al índice
La parte de verificación de estado se basa en el módulo de verificación de salud nginx_upstream_check_module de Yaoweibin (http://github.com/yaoweibin/nginx_upstream_check_module);
Este módulo tiene la licencia BSD.
Copyright (C) 2017-, por Changxun Zhou [email protected]
Copyright (C) 2014 de Weibin Yao [email protected]
Reservados todos los derechos.
Se permite la redistribución y el uso en formato fuente y binario, con o sin modificación, siempre que se cumplan las siguientes condiciones:
Las redistribuciones del código fuente deben conservar el aviso de derechos de autor anterior, esta lista de condiciones y el siguiente descargo de responsabilidad.
Las redistribuciones en formato binario deben reproducir el aviso de derechos de autor anterior, esta lista de condiciones y la siguiente exención de responsabilidad en la documentación y/u otros materiales proporcionados con la distribución.
ESTE SOFTWARE ES PROPORCIONADO POR LOS TITULARES DE DERECHOS DE AUTOR Y COLABORADORES "TAL CUAL" Y SE RENUNCIA A CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD E IDONEIDAD PARA UN PROPÓSITO PARTICULAR. EN NINGÚN CASO EL TITULAR DE LOS DERECHOS DE AUTOR O LOS COLABORADORES SERÁN RESPONSABLES DE NINGÚN DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, EJEMPLAR O CONSECUENTE (INCLUYENDO, PERO NO LIMITADO A, ADQUISICIÓN DE BIENES O SERVICIOS SUSTITUTOS; PÉRDIDA DE USO, DATOS O GANANCIAS; O INTERRUPCIÓN DEL NEGOCIO) CUALQUIER CAUSA Y EN CUALQUIER TEORÍA DE RESPONSABILIDAD, YA SEA POR CONTRATO, RESPONSABILIDAD ESTRICTA O AGRAVIO (INCLUYENDO NEGLIGENCIA O DE OTRA MANERA) QUE SURJA DE CUALQUIER MANERA DEL USO DE ESTE SOFTWARE, INCLUSO SI SE ADVIERTE DE LA POSIBILIDAD DE DICHO DAÑO.
Volver al índice
Volver al índice