miércoles, 3 de abril de 2019

HTTP Load Balancing en nginx



Cómo configurar load balancing de un servicio HTTP/HTTPS en nginx.



nginx, cuando actúa como reverse proxy, permite hacer balanceo de carga (load balancing) de las peticiones HTTP que le entran a un dominio determinado. Es decir, permite enviar tráfico entrante de un dominio hacia un servidor web u otro dependiendo de ciertas condiciones.

Imaginemos que tenemos un servicio antispam de la marca Barracuda, compuesto por dos aparatos cuyas IPs son 192.168.1.1 y 192.168.1.2. Estos aparatos están conectados en clúster para ofrecer un servicio de alta disponibilidad, de modo que si un aparato cae, el otro recibe todas las conexiones y sigue ofreciendo servicio y viceversa. Además, este clúster permite que los cambios aplicados en un apartado se repliquen al instante al otro aparato, de modo que la administración del servicio antispam puede realizarse desde cualquiera de las dos IPs.

Supongamos también que queremos apuntar la dirección antispam.dominio.com a los dos aparatos, pues apuntar el FQDN a una sola IP nos dejaría sin gestión si uno de los aparatos cayera.

nginx nos ofrece una solución a esta necesidad con su servicio de load balancing de tráfico HTTP. Para hacerlo, apuntamos antispam.dominio.com a la IP del servidor que corre nginx y en la configuración de nginx creamos una política "upstream" que haga balanceo de carga hacia dos o más servidores finales.

El código que nos permite hacer balanceo de carga HTTP es algo parecido a esto:

http {     upstream upstream_antispam {         server 192.168.1.1:8000;         server 192.168.1.2:8000;     }     server {         listen 443 ssl;         server_name antispam.dominio.com;         location / {             proxy_pass http://upstream_antispam;         }     } }

En este código, he creado un bloque "upstream" de nombre "upstream_antispam" que contiene las dos direcciones IP de los aparatos Barracuda, así como el puerto de gestión HTTP que usan (puerto 8000).

Debajo del bloque upstream, he creado un bloque "server" que realiza la función de reverse proxy (proxy_pass) y envía el tráfico al bloque upstream "upstream_antispam" anteriormente declarado.

Con esto, lo que conseguimos es que el tráfico que vaya a https://antispam.dominio.com se vaya repartiendo entre http://192.168.1.1:8000 y http://192.168.1.2:8000, según criterios varios como ¿están las dos IPs activas? ¿hay muchas sesiones activas en una de las IPs? etc.

A partir de este momento, si cae el aparato con IP 192.168.1.1, todo el tráfico que entre a https://antispam.dominio.com pasará a 192.168.1.2. Y si cayera el 192.168.1.2, todo el tráfico pasaría por 192.168.1.1. Si los dos están activos, el tráfico pasará por ambos.
1

1 comentario:

  1. Como puedo hacer para balancear dentro de una carpeta, del tipo http//ip_server/carpeta/index.php

    ResponderEliminar