Saltar a contenido

upsync: Módulo NGINX para sincronizar upstreams 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-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-upsync

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_upsync_module.so;

Este documento describe nginx-module-upsync v2.1.3 lanzado el 20 de noviembre de 2020.


Módulo C de Nginx, que puede sincronizar upstreams desde Consul u otros. Modifica dinámicamente los atributos de los servidores backend (peso, max_fails, ...), sin necesidad de recargar NGINX.

Puede que no siempre sea conveniente modificar archivos de configuración y reiniciar NGINX. Por ejemplo, si estás experimentando grandes cantidades de tráfico y alta carga, reiniciar NGINX y recargar la configuración en ese momento aumenta aún más la carga en el sistema y puede degradar temporalmente el rendimiento.

El módulo permite expandir y reducir sin afectar el rendimiento.

Otro módulo, nginx-stream-upsync-module soporta el módulo de stream de NGINX (protocolo TCP), por favor ten en cuenta.

Sinopsis

nginx-consul:

http {
    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 8080;

        location = /proxy_test {
            proxy_pass http://test;
        }

        location = /bar {
            proxy_pass http://bar;
        }

        location = /upstream_show {
            upstream_show;
        }

    }
}
nginx-etcd:
http {
    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 8080;

        location = /proxy_test {
            proxy_pass http://test;
        }

        location = /bar {
            proxy_pass http://bar;
        }

        location = /upstream_show {
            upstream_show;
        }

    }
}
upsync_lb:
http {
    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 8080;

        location = /proxy_test {
            proxy_pass http://test;
        }

        location = /bar {
            proxy_pass http://bar;
        }

        location = /upstream_show {
            upstream_show;
        }

    }
}

NOTA: se recomienda que strong_dependency esté configurado como apagado y que el primer archivo incluido incluya 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 o etcd y ajusta dinámicamente el peso de los servidores backend, el módulo extraerá oportunamente la nueva lista de servidores backend de consul o 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 el periodo 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 nginx no necesita recargarse, por lo que afecta poco al rendimiento de nginx.

  • estabilidad

    Incluso si una extracción falla, se extraerá en el siguiente upsync_interval, garantizando que el servidor backend proporcione servicios de manera estable. Y soporta volcar la última configuración a la ubicación, por lo que incluso si consul/etcd se cuelga, nginx puede recargarse en cualquier momento.

  • health_check

    nginx-upsync-module soporta la adición o eliminación de servidores con verificación de salud, necesitando nginx_upstream_check_module. Se recomienda nginx-upsync-module + nginx_upstream_check_module.

Directivas

upsync

syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=seconds/minutes] [upsync_timeout=seconds/minutes] [strong_dependency=off/on]
default: none, si se omiten parámetros, los parámetros predeterminados son upsync_interval=5s upsync_timeout=6m strong_dependency=off

context: upstream

description: 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 strong_dependency está activado, nginx extraerá servidores de consul/etcd cada vez que nginx se inicie o se recargue.

upsync_dump_path

syntax: upsync_dump_path $path

default: /tmp/servers_$host.conf

context: upstream

description: volcar los backends upstream a la $path.

upsync_lb

syntax: upsync_lb $load_balance

default: round_robin/ip_hash/hash modula

context: upstream

description: principalmente para least_conn y hash consistente, al usar uno de ellos, debes señalar que usas upsync_lb.

upstream_show

syntax: upstream_show

default: none

context: upstream

description: Mostrar todos los servidores backend específicos del upstream.

     location /upstream_list {
         upstream_show;
     }
curl http://127.0.0.1:8500/upstream_list?test;
curl http://127.0.0.1:8500/upstream_list;

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;

En el tercer caso, debe ser consul_health:

        upsync 127.0.0.1:8500/v1/health/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_health strong_dependency=off;

Los servicios con verificaciones de salud fallidas se marcan como inactivos con la API de salud.

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
        curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
    
    default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;

    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
el valor soporta formato json.

  • 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-inactivo

        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
        curl -X PUT http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
    
    default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;

    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
el valor soporta formato json.

  • 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-inactivo

        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
    

Check_module

soporte del módulo de verificación.

check-conf:

http {
    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;

        check interval=1000 rise=2 fall=2 timeout=3000 type=http default_down=false;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;

    }

    upstream bar {
        server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
    }

    server {
        listen 8080;

        location = /proxy_test {
            proxy_pass http://test;
        }

        location = /bar {
            proxy_pass http://bar;
        }

        location = /upstream_show {
            upstream_show;
        }

        location = /upstream_status {
            check_status;
            access_log off;
        }

    }
}

Estilo de código

El estilo de código se basa principalmente en style

ver también

dependencia de fuente

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-upsync.