Mantener el equilibrio del tráfico de red entre servidores, clientes y proxies es un aspecto clave para tener a los clientes satisfechos y optimizar la infraestructura. Con el equilibrio de carga de alto rendimiento de NGINX Plus, puede escalar y proporcionar redundancia, reconfigurar la infraestructura dinámicamente sin necesidad de reiniciar, así como habilitar el equilibrio de carga de servidores globales (GSLB), la persistencia de sesión y las comprobaciones de estado activas. NGINX Plus equilibra la carga no solo del tráfico HTTP, sino también de TCP, UDP y gRPC.
Al equilibrar la carga del tráfico HTTP, NGINX Plus finaliza todas las conexiones HTTP y procesa cada solicitud de forma individual. Puede eliminar el cifrado SSL/TLS, inspeccionar y manipular la solicitud, ponerla en cola con límites de velocidad y, después, seleccionar la política de equilibrio de carga.
Para mejorar el rendimiento, NGINX Plus puede aplicar una amplia gama de optimizaciones a una transacción HTTP de forma automática, incluidas las actualizaciones del protocolo HTTP, la optimización de keepalive y transformaciones como la compresión del contenido y el almacenamiento en caché de respuestas.
Equilibrar la carga de tráfico HTTP es muy fácil con NGINX Plus:
http {
upstream my_upstream {
server server1.example.com;
server server2.example.com;
}
server {
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://my_upstream;
}
}
}
Primero, especifique un servidor virtual con la directiva server
y, después, especifique el puerto de escucha del tráfico (listen
). Haga que las direcciones URL de las solicitudes de los clientes se correspondan con un bloque location
, establezca el encabezado Host
con la directiva proxy_set_header
e incluya la directiva proxy_pass
para reenviar la solicitud a un grupo ascendente. (El bloque upstream
define los servidores en los que NGINX Plus equilibra la carga de tráfico).
Para obtener más información, compruebe esta introducción para equilibrar la carga con NGINX y NGINX Plus.
NGINX Plus también puede equilibrar la carga de aplicaciones TCP, como MySQL, y de aplicaciones UDP, como DNS y RADIUS. Para las aplicaciones TCP, NGINX Plus finaliza las conexiones TCP y crea nuevas conexiones con el backend.
stream {
upstream my_upstream {
server server1.example.com:1234;
server server2.example.com:2345;
}
server {
listen 1123 [udp];
proxy_pass my_upstream;
}
}
La configuración es similar a la de HTTP: especifique un servidor virtual con la directiva server
, aplique listen
para el tráfico en un puerto y use la directiva proxy_pass
para pasar la solicitud a un grupo upstream
.
Para obtener más información sobre el equilibrio de carga de TCP y UDP, consulte la Guía de gestión de NGINX Plus.
NGINX Plus admite diversos métodos de equilibrio de carga de aplicaciones para HTTP, TCP y UDP. Todos ellos tienen en cuenta el valor weight que puede asignar de manera opcional a cada servidor ascendente.
Puede limitar el número de conexiones que NGINX Plus establece con los servidores TCP o HTTP ascendentes, o bien el número de sesiones con los servidores UDP. Cuando el número de conexiones o sesiones con un servidor supera un límite definido, NGINX Plus deja de establecer nuevas conexiones.
En el fragmento de código de configuración siguiente, el límite de conexiones es de 250 para webserver1 y de 150 para webserver2. La directiva queue
especifica el número máximo de conexiones en exceso que NGINX Plus coloca en la cola de escucha del sistema operativo durante un máximo de 30 segundos cada una; las solicitudes en exceso adicionales se eliminan.
upstream backend {
zone backends 64k;
queue 750 timeout=30s;
server webserver1 max_conns=250;
server webserver2 max_conns=150;
}
Cuando el número de conexiones activas de un servidor queda por debajo de su límite, NGINX Plus envía las conexiones desde la cola. La limitación de las conexiones ayuda a garantizar un servicio coherente y predecible de las solicitudes de los clientes, incluso durante los picos de tráfico.
Puede configurar NGINX Plus para identificar las sesiones de usuario y enviar todas las solicitudes de una sesión al mismo servidor ascendente. Esto es esencial cuando los servidores de aplicaciones almacenan el estado de forma local, ya que cuando se envía una solicitud para una sesión de usuario en curso a un servidor distinto se producen errores irrecuperables. La persistencia de sesión también puede mejorar el rendimiento cuando las aplicaciones comparten información en un clúster.
Además de la persistencia de sesión basada en hash compatible con NGINX Open Source (métodos de equilibrio de carga Hash y Hash IP), NGINX Plus admite persistencia de sesión basada en cookies, incluido el método sticky cookie. NGINX Plus agrega una cookie de sesión a la primera respuesta del grupo ascendente a un cliente dado, lo que identifica de forma segura qué servidor ha generado la respuesta. Las solicitudes del cliente posteriores incluyen la cookie, que NGINX Plus utiliza para enrutar la solicitud al mismo servidor ascendente:
upstream backend {
server webserver1;
server webserver2;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
En el ejemplo anterior, NGINX Plus inserta una cookie llamada srv_id en la respuesta de cliente inicial para identificar el servidor que ha gestionado la respuesta. Cuando una solicitud posterior contiene la cookie, NGINX Plus la reenvía al mismo servidor.
NGINX Plus también admite los métodos de persistencia de aprendizaje persistente y ruta persistente.
Nota: La persistencia de sesión basada en cookies es exclusiva de NGINX Plus.
De forma predeterminada, NGINX realiza comprobaciones básicas en las respuestas procedentes de servidores ascendentes y vuelve a probar las solicitudes con errores cuando es posible. NGINX Plus agrega comprobaciones de estado de aplicaciones fuera de banda (lo que también se conoce como transacciones sintéticas) y una función de inicio lento para agregar servidores nuevos y recuperados al grupo de carga equilibrada sin problemas.
Estas características permiten que NGINX Plus pueda detectar y evitar una variedad de problemas mucho mayor, lo que mejora significativamente la fiabilidad de sus aplicaciones HTTP y TCP/UDP.
upstream my_upstream {
zone my_upstream 64k;
server server1.example.com slow_start=30s;
}
server {
# ...
location /health {
internal;
health_check interval=5s uri=/test.php match=statusok;
proxy_set_header Host www.example.com;
proxy_pass http://my_upstream
}
}
match statusok {
# Se usa para /test.php health check
status 200;
header Content-Type = text/html;
body ~ "Server[0-9]+ is alive";
}
En el ejemplo siguiente, NGINX Plus envía una solicitud para /test.php cada cinco segundos. El bloque match
define las condiciones que la respuesta debe cumplir para que se considere que el servidor ascendente está en buen estado: un código de estado de 200
OK
y un cuerpo de respuesta que contenga el texto ServerN
is
alive
.
Nota: Las comprobaciones de estado activas son exclusivas de NGINX Plus.
De forma predeterminada, los servidores NGINX Plus resuelven los nombres DNS al inicio y almacenan en caché los valores resueltos de forma persistente. Cuando usa un nombre de dominio como example.com para identificar un grupo de servidores ascendentes con la directiva server
y el parámetro resolve
, NGINX Plus vuelve a resolver de forma periódica el nombre de dominio. Si la lista de direcciones IP asociada ha cambiado, NGINX Plus comienza a aplicar inmediatamente el equilibrio de carga en el grupo de servidores actualizado.
Para configurar NGINX Plus a fin de que use registros SRV
de DNS, incluya la directiva resolver
junto con el parámetro service=http
en la directiva server
, tal y como se muestra:
resolver 127.0.0.11 valid=10s;
upstream service1 {
zone service1 64k;
server service1 service=http resolve;
}
En el ejemplo anterior, NGINX Plus consulta 127.0.0.11 (el servidor DNS de Docker integrado) cada 10 segundos para volver a resolver el nombre de dominio service1.
Nota: La detección de servicios con DNS es exclusiva de NGINX Plus.
NGINX Plus incluye una API RESTful con un solo punto de conexión de API. Use la API de NGINX Plus para actualizar sobre la marcha las configuraciones ascendentes y los almacenes de clave-valor sin tiempo de inactividad.
El fragmento de código de configuración siguiente incluye la directiva api
para habilitar el acceso de lectura-escritura en el punto de conexión /api.
upstream backend {
zone backends 64k;
server 10.10.10.2:220 max_conns=250;
server 10.10.10.4:220 max_conns=150;
}
server {
listen 80;
server_name www.example.org;
location /api {
api write=on;
}
}
Con la API habilitada como en el ejemplo anterior, puede agregar un nuevo servidor a un grupo ascendente que ya exista con el comando curl
siguiente. Se utiliza el método POST
y codificación JSON para establecer la dirección IP del servidor en 192.168.78.66, su valor weight en 200 y el número máximo de conexiones simultáneas en 150. (Para versión
, sustituya el número de versión actual de la API tal y como se especifica en la documentación de referencia.)
$ curl -iX POST -d '{"server":"192.168.78.66:80","weight":"200","max_conns":"150"}' http://localhost:80/api/versión/http/upstreams/backend/servers/
Para mostrar la configuración completa de todos los servidores ascendentes de backend en formato JSON, ejecute:
$ curl -s http://localhost:80/api/versión/http/upstreams/backend/servers/ | python -m json.tool
{
"backup": false,
"down": false,
"fail_timeout": "10s",
"id": 0,
"max_conns": 250,
"max_fails": 1,
"route": "",
"server": "10.10.10.2:220",
"slow_start": "0s",
"weight": 1
},
{
"backup": false,
"down": false,
"fail_timeout": "10s",
"id": 1,
"max_conns": 150,
"max_fails": 1,
"route": "",
"server": "10.10.10.4:220",
"slow_start": "0s",
"weight": 1
},
{
"backup": false,
"down": false,
"fail_timeout": "10s",
"id": 2,
"max_conns": 200,
"max_fails": 1,
"route": "",
"server": "192.168.78.66:80",
"slow_start": "0s",
"weight": 200
}
Para modificar la configuración de un servidor ascendente ya existente, identifíquelo mediante su ID interno, que aparece en el campo id
de la salida anterior. El comando siguiente utiliza el método PATCH
para reconfigurar el servidor con ID 2 y configura su dirección IP y puerto de escucha en 192.168.78.55:80, su valor weight en 500 y el límite de conexiones en 350.
$ curl -iX PATCH -d '{"server":"192.168.78.55:80","weight":"500","max_conns":"350"}' http://localhost:80/api/versión/http/upstreams/backend/servers/2
Puede acceder a la documentación completa de Swagger (Especificaciones de OpenAPI) de la API de NGINX Plus en https://demo.nginx.com/swagger-ui/.
Nota: La API de NGINX Plus es exclusiva de NGINX Plus.