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 estadisticas

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.