Детали сборки Travis CI: нажмите, чтобы увидеть
(中文版本请参看这里)
Проверка работоспособности вышестоящих серверов Nginx (поддержка восходящего потока http и восходящего потока)
Этот модуль может предоставить NGINX возможность активной проверки работоспособности внутреннего сервера (поддерживает проверку работоспособности как четырех, так и семи серверных серверов).
Этот модуль nginx все еще находится в разработке, вы можете помочь его улучшить.
Проект также хорошо развит в разработке, и вы можете добавлять код или сообщать об ошибках. Вместе, чтобы сделать его лучше.
Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной:
QQ
: 373882405mail
: [email protected]Когда вы используете nginx в качестве балансировщика нагрузки, nginx изначально предоставляет только базовые повторные попытки, чтобы обеспечить доступ к обычному внутреннему серверу.
Напротив, этот сторонний модуль nginx обеспечивает упреждающее определение состояния работоспособности внутренних серверов.
Он поддерживает список внутренних серверов, которые гарантируют, что новые запросы отправляются непосредственно на исправный внутренний сервер.
Ключевые особенности:
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
Вернуться к оглавлению
пример 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;
}
}
интерфейс статуса
Один типичный вывод: (формат 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 #
или (формат Прометея)
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 #
Вернуться к оглавлению
Syntax
интервал проверки=миллисекунды [падение=счет] [подъем=счет] [таймаут=миллисекунды] [default_down=true|false] [type=tcp|udp|http] [port=check_port]
Default
: интервал=30000 падение=5 подъем=2 таймаут=1000 default_down=true type=tcp
Context
: http/восходящий поток || поток/выше по течению
Эта команда может открыть функцию проверки работоспособности внутреннего сервера.
Detail
interval
: интервал отправки пакета проверки работоспособности на серверную часть.fall
( fall_count
): сервер считается неработающим, если количество последовательных сбоев достигает Fall_count.rise
( rise_count
): сервер считается работающим, если количество последовательных успехов достигаетrise_count.timeout
: тайм-аут для внутреннего запроса работоспособности.default_down
: устанавливает начальное состояние сервера, если оно истинно, это означает, что по умолчанию выключено, если ложно, то включено. Значение по умолчанию — true, что означает, что сервер, который недоступен, начинает ждать, пока пакет проверки работоспособности достигнет определенного количества раз, после чего успех будет считаться работоспособным.type
: тип пакета проверки работоспособности, теперь поддерживаются следующие типыtcp
: простое TCP-соединение. Если соединение успешное, серверная часть отображается нормально.udp
: просто отправлять пакеты udp. Если вы получаете ошибку icmp (хост или порт недоступен), отображается внутреннее исключение. (В блоке конфигурации потока поддерживается только проверка типа UDP)http
: отправьте HTTP-запрос по состоянию ответного пакета серверной части, чтобы определить, выживет ли серверная часть.Ниже приведен пример:
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/сервер/местоположение.
Ниже приведен пример:
http {
server {
listen 80 ;
# status interface
location /status {
healthcheck_status;
}
...
}
Вы можете указать формат отображения по умолчанию. Форматы могут быть html
, csv
или json
. Тип по умолчанию — html
. Он также поддерживает указание формата с помощью аргумента запроса. Предположим, что ваше местоположение check_status
— «/status», аргумент format
может изменить формат отображаемой страницы. Вы можете сделать следующее:
/status?format=html
/статус?формат=csv
/status?format=json
/status?format=прометей
В настоящее время вы можете получить список серверов с одинаковым статусом с помощью аргумента status
. Например:
/status?format=json&status=down
/status?format=html&status=down
/status?format=csv&status=up
/status?format=прометей&status=вверх
Вернуться к оглавлению
Вернуться к оглавлению
Пожалуйста, сообщайте об ошибках
или отправьте исправления
Вернуться к оглавлению
Чэнс Чжоу (周长勋) [email protected].
Вернуться к оглавлению
Часть проверки работоспособности основана на модуле проверки работоспособности Yaoweibin nginx_upstream_check_module (http://github.com/yaoweibin/nginx_upstream_check_module);
Этот модуль лицензируется по лицензии BSD.
Авторские права (C) 2017-, Чансюнь Чжоу [email protected]
Авторские права (C) 2014 г., Вейбин Яо [email protected]
Все права защищены.
Распространение и использование в исходной и бинарной форме, с модификациями или без них, разрешено при соблюдении следующих условий:
При повторном распространении исходного кода должно сохраняться вышеуказанное уведомление об авторских правах, этот список условий и следующий отказ от ответственности.
При повторном распространении в двоичной форме должно воспроизводиться вышеуказанное уведомление об авторских правах, этот список условий и следующий отказ от ответственности в документации и/или других материалах, прилагаемых к дистрибутиву.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ОБЛАДАТЕЛЯМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ «КАК ЕСТЬ», И ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ ТОВАРНОЙ ГОДНОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ОТКАЗЫВАЮТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ОБЛАДАТЕЛЬ АВТОРСКИХ ПРАВ ИЛИ УЧАСТНИКИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ПРИМЕРНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПРИОБРЕТЕНИЕ ЗАМЕНЯЮЩИХ ТОВАРОВ ИЛИ УСЛУГ; ПОТЕРЮ ИСПОЛЬЗОВАНИЯ, ДАННЫХ, ИЛИ ПРИБЫЛЬ ИЛИ ПРЕРЫВАНИЕ БИЗНЕСА), КАКОЙ-ЛИБО ВЫЗВАННОЙ И НА ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУДЬ В ДОГОВОРЕ, СТРОГО ОТВЕТСТВЕННОСТИ ИЛИ ПРАВОНАРУШЕНИЯ (ВКЛЮЧАЯ НЕБРЕЖНОСТЬ ИЛИ ДРУГОЕ), ВОЗНИКАЮЩИХ ЛЮБЫМ СПОСОБОМ ИСПОЛЬЗОВАНИЯ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ Уведомлено об этом. ВОЗМОЖНОСТЬ ТАКОГО ПОВРЕЖДЕНИЯ.
Вернуться к оглавлению
Вернуться к оглавлению