Balanceadores de carga con haproxy, apache2 y nginx

Introducción

En el Servidor 2 Servidor 3 tenemos configuradas dos páginas webs de ejemplo. Por lo tanto configurando en Servidor 1 un balanceador de carga veremos como va repartiendo las peticiones entre los dos servidores webs en backend.

A continuación se especifica la configuración mínima para configurar un balanceador de carga en:

  • Apache2
  • Nginx
  • Haproxy

En esta entrada solo se describirá la configuración del Servidor1 se entiende que ya disponemos de servidores webs configurados con un sitio web en cada uno de ellos.

Configurar Apache2 como Balanceador de carga

Instalar apache2:

Habilitar los siguientes módulos:

Añadir la configuración en el fichero de configuración del sitio:

Reiniciar el servicio de apache2:

Testeo:

El pase de diapositivas requiere JavaScript.

Configurar Nginx como Balanceador de carga

Instalar el paquete:

Crear el siguiente fichero de configuración para el balanceo:

/etc/nginx/conf.d/load-balancer.conf

Eliminar el enlace simbólico del sitio por defecto:

Reiniciar nginx:

Testeo:

El pase de diapositivas requiere JavaScript.

Configurar Haproxy como Balanceador de carga

Instalar haproxy:

Hacer una copia de respaldo del fichero de configuración y añadir el siguiente código al fichero de configuración nuevo:

/etc/haproxy/haproxy.cfg

Ahora habilitar el servicio y arrancarlo:

Finalmente si accedemos a la dirección del servidor y recargamos varias veces podemos ver como intercambia el sitio web entre los servidores backends. Si accedemos a la url http://www.servidor1.com/haproxy?stats, podremos visualizar las estadísticas de estos:

El pase de diapositivas requiere JavaScript.

Si visualizáramos el log de acceso de uno de los servicios apache de los servidores backends, tendría sentido que solo apareciera la dirección IP interna del servidor1, ya que es el que hace la petición al servidor interno y no el propio cliente directamente.

En este caso 10.0.0.1:

tail -f /var/log/apache2/access.log

 

Configurar las conexiones persistentes (sticky cookies) en Haproxy

La configuración anterior funciona bien siempre y cuando no se haga uso de sesiones en el sitio web, ya que la cookie de la sesión se almacena en el servidor backend y en el momento que se volviera a solicitar una petición en esa sesión y le respondiera el otro servidor backend al haproxy, se perdería la sesión.

Así que para hacer la prueba vamos añadir un pequeño código PHP en los servidores backends, importante recordar que deben saber interpretar el código php los servidores, así que instalaremos por ejemplo el módulo de apache2 para dichas pruebas.

Instalar el módulo en los servidores backend:

Reiniciar el servicio:

Y añadir el fichero:

/var/www/html/index.php

Ahora si repetimos la acción de ir refrescando el navegador podemos ver que no se mantiene el numero de visitas de manera consecutiva como debería ser, significando así que no se esta manteniendo la misma sesión al balancear entre los servidores:

El pase de diapositivas requiere JavaScript.

 

Otra forma de ver que esto no es capaz de mantener la sesión cuando balancea es utilizar la herramienta curl, lanzando esta instrucción:

Podemos ver que nos devuelve que es la primera vez que visitamos la página

Si volvemos a realizar un par de veces la instrucción anterior pero pasandole como parámetro –cookie seguido del identificador de la cookie, vemos como no es capaz de mantenerla:

El pase de diapositivas requiere JavaScript.

 

Para solventar esto como comente al principio del apartado tendremos que realizar una modificación al fichero de configuración de haproxy:

/etc/haproxy/haproxy.cfg

Ahora si abrimos una nueva sesión desde una pestaña en modo incógnito preferiblemente, se puede comprobar que funciona correctamente a pesar de estar balanceando, y si hacemos la prueba con curl, vemos como respondiendo el mismo identificador de cookie, haproxy indica internamente que si ha respondido X servidor la primera petición, este será el encargado de seguir respondiendo:

Comprobación desde el navegador

El pase de diapositivas requiere JavaScript.

Comprobación con curl

El pase de diapositivas requiere JavaScript.

Conclusión

Sin haber entrado mucho en profundidad la verdad que los balanceadores de carga a día de hoy me parecen imprescindibles, en escenarios e infraestructuras donde tenemos elevadas cifras de peticiones  a servicios, el tener 2 máquinas balanceando delante de los servidores backends me parece necesario. En esta entrada se ha hecho la prueba con un servicio web, pero obviamente también es posible con cualquier servicio que se nos ocurra como por ejemplo correo.

Espero que te haya gustado tanto como a mí y te haya sido útil como referencia 😉

Autor entrada: CharlieJ

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *