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.
Comentarios