En ocasiones necesitaremos balancear las visitas que tienen nuestras aplicaciones web. Por ejemplo, tener un sólo servidor para PrestaShop o Magento que reciba muchísimas visitas puede hacer que la web cargue muy lenta debido a las visitas.

Por eso siempre puede ser muy buena idea utilizar HAProxy para balancear esas visitas y así optimizar mejor los recursos de los diferentes frontales webs que podamos tener.

Vamos a configurar HAProxy y Apache en varios servidores con Ubuntu Server 18.04 y tendremos en cuenta que por ejemplo, si entras en la web usando el primer frontal y te genera una cookie, si luego te redireccionan al segundo frontal esa cookie exista también en el otro frontal -y así evitar problemas de inicios de sesión etc-.

Estructura de nuestra infraestructura

Esta será nuestra estructura de servidores:

Tendremos un servidor HAProxy y luego dos servidores webs llamados Frontal-01 y Frontal-02.

Nuestro dominio apuntará directamente al servidor HAProxy y éste se conectará a los servidores web mediante la red interna. Por lo que vamos a tener el servidor HAProxy con IP pública e IP privada y los dos servidores web con acceso únicamente por red privada -con lo que no abra acceso público-.

La ventaja de utilizar HAProxy, es que si tenemos la necesidad de añadir un tercer frontal simplemente hay que configurar y añadirlo a la configuración.

Instalación de HAProxy

Como siempre, lo primero, actualizamos repositorios:

apt update
apt upgrade

Luego instalamos el paquete necesario para HAProxy:

apt install haproxy

Configuración para HAProxy

En el fichero de configuración /etc/haproxy/haproxy.cfg vamos a añadir lo siguiente:

global
        log     127.0.0.1       local0
        log     127.0.0.1       local1  notice
        maxconn 256
        user    haproxy
        group   haproxy
        daemon

defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        maxconn 8000
        timeout connect 5s
        timeout client  300s
        timeout server  300s
        retries 3
        timeout check   10s
        timeout queue   1m
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

listen web_server
        bind    *:80
        mode    http
        stats   enable
        stats   auth    cda:cda
        balance roundrobin
        server  frontal-01      10.20.10.70
        server  frontal-02      10.20.10.69

Si os fijáis, en la parte final hemos configurado los dos frontales con la IP privada. Si queremos añadir un tercero simplemente deberíamos de añadir una línea más:

server  nombreFrontal      [IP_Privada]
server  frontal-01         10.20.10.70

Y una vez tenemos configurado HAProxy y nuestros frontales web, guardamos la configuración y luego reiniciamos y habilitamos el servicio:

systemctl enable haproxy
systemctl restart haproxy

Frontal-01 y Frontal-02

En ambos servidores tendremos instalado un servidor web con nuestras webs alojadas. Para este tutorial, simplemente hemos modificado la pagina por defecto que viene en Apache y la hemos modificado para saber en cada momento desde que Frontal carga la web:

Habilitar estadísticas

Para ello tenemos que modificar el fichero de configuración de HAProxy:

nano /etc/haproxy/haproxy.cfg

Y añadimos lo siguiente al final:

listen stats
        bind *:8083
        mode http
        stats enable
        stats uri /stats
        stats realm HAProxy\ Statistics
        stats auth haproxy:web_server
        stats refresh 2s

Y podremos acceder desde el navegador desde http://IP_servidor_HAProxy:8083/stats

Estadísticas de HAProxy

Controlar y comprobar el estado las cookies

Modificamos el fichero de configuración /etc/haproxy/haproxy.cfg para  añadir lo siguiente:

listen web_server
        bind    *:80
        mode    http
        stats   enable
        stats   auth    cda:cda
        balance roundrobin
        option httpchk GET /index.php HTTP/1.0
        http-check expect rstatus (2|3)[0-9][0-9]|503
        cookie voidnull prefix indirect nocache
        server  frontal-01      10.20.10.70
        server  frontal-02      10.20.10.69

Lo que haremos es configurar la cookie con el nombre que le ponemos, por ejemplo he creado un fichero index.php con el siguiente contenido para hacer pruebas:

<?php

echo "<h1> Frontal-02</h1>";

$cookie_name = "voidnull";
$cookie_value = "voidnull.es";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day

if(!isset($_COOKIE[$cookie_name])) {
    echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
    echo "Cookie '" . $cookie_name . "' is set!<br>";
    echo "Value is: " . $_COOKIE[$cookie_name];
}
?>

Si ahora accedemos, veremos que al principio no habrá cookie asignada y tras actualizar se asignará la IP. Si seguimos refrescando, se cambiará de Frontal y cargará la misma cookie.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación