sticky: Módulo de cookies sticky de NGINX
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-sticky
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-sticky
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_sticky_module.so;
Este documento describe nginx-module-sticky v1.3.0 lanzado el 27 de junio de 2022.
versión modificada y extendida; consulta Changelog.txt
Descripción
Un módulo de nginx para añadir una cookie sticky que siempre se reenvía al mismo servidor upstream.
Al tratar con varios servidores backend, a veces es útil que un cliente (navegador) sea siempre atendido por el mismo servidor backend (por ejemplo, para la persistencia de sesión).
Usar una persistencia por IP (con el módulo upstream ip_hash) puede no ser una buena idea porque podría haber situaciones en las que muchos navegadores diferentes vengan con la misma dirección IP (detrás de proxies) y el sistema de balanceo de carga no será justo.
Usar una cookie para rastrear el servidor upstream hace que cada navegador sea único.
Cuando el módulo sticky no puede aplicarse, vuelve al clásico Round Robin Upstream o devuelve un "Bad Gateway" (dependiendo de la bandera no_fallback).
El módulo sticky no puede aplicarse cuando las cookies no son soportadas por el navegador.
El módulo sticky se basa en un algoritmo de "mejor esfuerzo". Su objetivo no es manejar la seguridad de ninguna manera. Ha sido diseñado para asegurar que los usuarios normales siempre sean redirigidos al mismo servidor backend: ¡eso es todo!
Uso
upstream {
sticky;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
sticky [hash=index|md5|sha1] [no_fallback]
[name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];
o
sticky [hmac=md5|sha1 hmac_key=<foobar_key>] [no_fallback]
[name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];
o
sticky [text=raw] [no_fallback]
[name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];
Algoritmo de selección de servidor: - hash: el mecanismo de hash para codificar el servidor upstream. No puede usarse con hmac o text. por defecto: md5
- md5|sha1: hash bien conocido
- index: no se aplica hash, se utiliza un índice en memoria en su lugar, es más rápido y la sobrecarga es menor
Advertencia: la coincidencia contra la lista de servidores upstream
es inconsistente. Así que, al recargar, si los servidores upstream
han cambiado, los valores de índice no están garantizados para
corresponder al mismo servidor que antes.
¡ÚSELO CON PRECAUCIÓN y solo si lo necesita!
-
hmac: el mecanismo de hash HMAC para codificar el servidor upstream. Es como el mecanismo de hash pero utiliza hmac_key para asegurar el hashing. No puede usarse con hash o text. md5|sha1: hash bien conocido
-
hmac_key: la clave a usar con hmac. Es obligatoria cuando se establece hmac.
-
no_fallback: cuando esta bandera está establecida, nginx devolverá un 502 (Bad Gateway o Proxy Error) si una solicitud llega con una cookie y el backend correspondiente no está disponible. Puedes establecerlo en el bloque upstream, o establecer "sticky_no_fallback" en un bloque de servidor o ubicación.
Configuración de cookies: - name: el nombre de la cookie utilizada para rastrear el servidor upstream persistente; por defecto: route
-
domain: el dominio en el que la cookie será válida por defecto: ninguno. Deja que el navegador maneje esto.
-
path: la ruta en la que la cookie será válida por defecto: /
-
expires: la duración de validez de la cookie por defecto: nada. Es una cookie de sesión. restricción: debe ser una duración mayor a un segundo
-
secure habilitar cookies seguras; transferidas solo a través de https
- httponly habilitar cookies para que no se filtren a través de js
Mecanismo Detallado
- ver docs/sticky.{vsd,pdf}
Problemas y Advertencias:
-
al usar diferentes configuraciones upstream con sticky que utilizan el mismo dominio pero se refieren a diferentes configuraciones de ubicación, podría ser prudente establecer una ruta / opción de ruta diferente en cada una de estas configuraciones upstream como se describe aquí: https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/issue/7/leaving-cookie-path-empty-in-module
-
el módulo sticky no funciona con la opción "backup" del ítem de configuración "server".
- el módulo sticky podría funcionar con el nginx_http_upstream_check_module (a partir de la versión 1.2.3)
Descargas
- los tarballs están disponibles a través de etiquetas del repositorio: https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/downloads
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-sticky.