stream-upsync: módulo NGINX para sincronizar backends de stream desde consul o etcd
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-stream-upsync
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-stream-upsync
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_stream_upsync_module.so;
Este documento describe nginx-module-stream-upsync v1.2.2 lanzado el 02 de enero de 2020.
nginx-consul:
stream {
upstream test {
upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
stream {
upstream test {
upsync 127.0.0.1:2379/v2/keys/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=etcd strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
stream {
upstream test {
least_conn; //hash $uri consistent;
upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
upsync_lb least_conn; //hash_ketama;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
NOTA: la inclusión del comando upstream es necesaria; la primera vez el archivo volcado debe incluir todos los servidores.
Descripción
Este módulo proporciona un método para descubrir servidores backend. Soporta la adición o eliminación dinámica de servidores backend a través de consul/etcd y ajusta dinámicamente el peso de los servidores backend. El módulo extraerá oportunamente la nueva lista de servidores backend de consul/etcd para sincronizar el enrutador IP de nginx. Nginx no necesita recargarse. Tiene algunas ventajas sobre otros:
-
oportuno
el módulo envía la clave a consul/etcd con un índice, consul/etcd lo comparará con su índice; si el índice no cambia, la conexión se mantendrá durante cinco minutos, en ese período cualquier operación sobre la clave-valor se retroalimentará de inmediato.
-
rendimiento
Extraer de consul/etcd equivale a una solicitud a nginx; actualizar el enrutador IP de nginx no requiere recarga, por lo que el impacto en el rendimiento de nginx es mínimo.
-
estabilidad
Incluso si una extracción falla, se intentará nuevamente en el siguiente upsync_interval, garantizando que el servidor backend proporcione servicios de manera estable. Además, soporta volcar la última configuración a una ubicación, por lo que incluso si consul/etcd se cuelga, nginx puede recargarse en cualquier momento.
Directivas
upsync
syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=segundos/minutos] [upsync_timeout=segundos/minutos] [strong_dependency=off/on]
contexto: upstream
descripción: Extraer servidores upstream de consul/etcd... .
Los significados de los parámetros son:
-
upsync_interval
tiempo de intervalo para extraer servidores de consul/etcd.
-
upsync_timeout
tiempo de espera para la solicitud de extracción de servidores de consul/etcd.
-
upsync_type
tipo de servidor de extracción de la configuración.
-
strong_dependency
cuando nginx se inicia, si strong_dependency está activado, significa que los servidores dependerán de consul/etcd y se extraerán de consul/etcd.
upsync_dump_path
syntax: upsync_dump_path $path
default: /tmp/servers_$host.conf
contexto: upstream
descripción: volcar los backends upstream en el $path.
upsync_lb
syntax: upsync_lb $load_balance
default: round_robin/ip_hash/hash modula
contexto: upstream
descripción: principalmente para least_conn y hash consistente; al usar uno de ellos, debes señalar el uso de upsync_lb.
upsync_show
syntax: upsync_show
default: ninguno
contexto: server
descripción: mostrar todos los upstreams.
curl http://localhost:2345/upstream_show
mostrar todos los upstreams
Consul_interface
Los datos pueden ser tomados del almacén de clave/valor o del catálogo de servicios. En el primer caso, el parámetro upsync_type de la directiva debe ser consul. Por ejemplo
upsync 127.0.0.1:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
En el segundo caso, debe ser consul_services.
upsync 127.0.0.1:8500/v1/catalog/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;
Puedes agregar o eliminar servidores backend a través de consul_ui o http_interface. A continuación se presentan ejemplos para el almacén de clave/valor.
ejemplo de http_interface:
- agregar
default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
o
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
-
eliminar
curl -X DELETE http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port -
ajustar-peso
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port o curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port -
marcar servidor-fallido
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port o curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port -
verificar
curl http://$consul_ip:$port/v1/kv/upstreams/$upstream_name?recurse
Etcd_interface
Puedes agregar o eliminar servidores backend a través de http_interface.
principalmente como etcd, ejemplo de http_interface:
- agregar
default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d value="{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port
-
eliminar
curl -X DELETE http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port -
ajustar-peso
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port -
marcar servidor-fallido
curl -X PUT -d value="{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port -
verificar
curl http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name
Estilo de código
El estilo de código se basa principalmente en style
ver también
- el nginx_upstream_check_module: https://github.com/alibaba/tengine/blob/master/src/http/ngx_http_upstream_check_module.c
- el parche del nginx_upstream_check_module: https://github.com/yaoweibin/nginx_upstream_check_module
- o basado en https://github.com/xiaokai-wang/nginx_upstream_check_module
dependencia de código fuente
- Cjson: https://github.com/kbranigan/cJSON
- http-parser: https://github.com/nodejs/http-parser
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-stream-upsync.