Balanceo de carga con HAProxy en Ubuntu 18.04

El balanceo de carga es comúnmente utilizado en entornos web, para distribuir aplicaciones de manera horizontal a través de múltiples nodos, al mismo tiempo que proporciona a los usuarios un único punto de acceso. Uno de los productos más populares dentro del campo del software libre, en lo que respecta a soluciones de balanceo de carga es HAProxy, que nos ofrece además de alta disponibilidad, funcionalidades de proxy. Funciona con aplicaciones que usen los protocolos TCP, HTTP y HTTPS, sobre la capa 4 (capa de transporte)

Cuéntame más sobre HAProxy

HAProxy tiene como principal objetivo optimizar el uso de los recursos, maximizar el rendimiento y minimizar el tiempo de respuesta. Esta disponible en la mayoría de los repositorios de nuestras distribuciones favoritas GNU/Linux, pero en nuestro caso vamos a utilizar una distribución con Ubuntu 18.04

HAProxy está pensado para sitios web con mucho tráfico con el objetivo de proporcionar estabilidad, confiabilidad y rendimiento. En este ejemplo utilizaremos tres servidores web, que previamente he creado en mi proveedor de confianza Clouding.io, dos de ellos tendrán servidores web con Apache , con el servidor web ya instalado (hace un tiempo escribí como instalar un servidor LAMP)y en el tercero tendremos instalado HAProxy. También se podría hacer algo similar en un solo nodo, utilizando la tecnología de contenedores de Docker, pero eso quizás os lo explico otro día.

En un entorno ideal solo el servidor con HAProxy debe estar de cara al público en la parte de frontend en la DMZ, en cambio los dos servidores web, estarán en la parte de backend. Para conseguir esto, habilitaremos solo el puerto 80 para el servidor frontal. Para que los hosts se comuniquen entre sí, sin utilizar sus IP públicas habilitamos su red privada.

Habilitar la red privada en el panel de Clouding.io

La configuración de la red, en el caso de los nodos de prueba para esta entrada, es la siguiente:

frontal.bitsandlinux.com   10.20.10.6/24
webserver01.bitsandlinux.com    10.20.10.2/24
webserver02.bitsandlinux.com    10.20.10.5/24

Instalar HAProxy en Ubuntu 18.04

Una vez ya hemos accedido al servidor frontal ya podemos realizar la instalación del producto, para ello primero habilitamos el repositorio correspondiente (para tener una versión reciente) y a continuación instalamos el paquete:

  1. sudo add-apt-repository ppa:vbernat/haproxy-2.1
  2. sudo apt-get update
  3. sudo apt-get install haproxy

Configurar el balanceo de carga en HAProxy

Los primero que haremos es realizar una copia de seguridad del fichero de configuración ubicado en /etc/haproxy/haproxy.cfg, de la siguiente manera:

sudo  cp -p /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.original

A la configuración por defecto le añadiremos los datos que a nosotros nos interesan.

Añadir el puerto de escucha

Primero añadimos un puerto de escucha (listener), que es el que recibirá las nuevas conexiones:

frontend frontal
    bind *:80
    mode http
    default_backend nodoswebserve

Ahora toca añadir la configuración de los nodos de la parte del backend, en la misma sección:

  1. backend nodoswebserver
  2.     balance roundrobin
  3.     option forwardfor
  4.     http-request set-header X-Forwarded-Port %[dst_port]
  5.     http-request add-header X-Forwarded-Proto https if { ssl_fc }
  6.     option httpchk HEAD / HTTP/1.1rnHost:localhost
  7.     server webserver01.bitsandlinux.com  10.20.10.2:80
  8.     server webserver02.bitsandlinux.com  10.20.10.5:80

Añadir estadísticas

De manera adicional podemos habilitar la consulta de estadísticas en directo del funcionamiento del servidor. Aquí podemos escoger el puerto que queramos. También es importante definir un usuario y contraseña para el acceso:

listen stats
        bind *:8185
        mode http
        stats enable
        stats uri /stats
        stats realm HAProxy\ Statistics
        stats auth haproxyuser:haproxypasswd

Ahora ya podemos guardar y reiniciar el servicio:

systemctl restart haproxy

De esta forma, si todo ha ido bien, ya podemos comprobar que efectivamente está funcionando.

He modificado el index.html por defecto en los nodos, para que me diga que nodo está usando en cada momento:

Si consultamos la IP o URL del frontal más el puerto definidio anteriormente, para consultar las estadísticas, tendremos un resultado similar al siguiente:

Muestra de las estadístticas en HAProxy (click en imagen para ampliar)

Si queremos que el refresco de la información sea diferente, debemos modificar el fichero de configuración y añadir:

#Es un ejemplo
stats   refresh 10s

Y esto es todo. Hemos visto como instalar y configurar un servidor para balanceo de carga básico con HAProxy. El tema tiene mucha miga, por lo que puede que más adelante siga jugando con este producto, por lo que estad atentos 🙂

Fuentes consultadas

Guía sobre HAProxy en la comunidad de Clouding.io