HaProxy s'est imposé comme la référence des Load Balancer OpenSource.
La nouvelle version 2.8 LTS sortie en Mai 2023, ajoute un certain nombre de fonctionnalités de haut niveau, voir la page d'annonce des nouveautés.
Cet article met largement à jour le précédent article qui datait de 2015.
Prérequis
- Une Debian 12 toute fraîchement installée
- Un firewall (sur la machine ou en amont)
- Une carte réseau connectée sur le réseau extérieur
- Une carte réseau connectée sur le réseau interne
Schéma
Installation HaProxy 2.8
Pour déployer la dernière version LTS d'HaProxy :
Préparation du fichier haproxy.list
curl https://haproxy.debian.net/bernat.debian.org.gpg | gpg --dearmor > /usr/share/keyrings/haproxy.debian.net.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy.debian.net.gpg]" http://haproxy.debian.net bookworm-backports-2.8 main > /etc/apt/sources.list.d/haproxy.list
Installation :
apt update
apt install haproxy
Configuration basique
Voici une configuration de base avec deux frontend (stats et web) et deux serveurs en backend, ce qui correspond au schéma vu plus haut.
# Paramètres généraux
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
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
# Fine tuning
timeout http-request 5s
timeout http-keep-alive 2s
timeout queue 5s
timeout tunnel 2m
timeout client-fin 1s
timeout server-fin 1s
timeout connect 5000
timeout client 50000
timeout server 50000
# Frontends
frontend stats
bind IP_Externe:8080
stats enable
stats hide-version
stats uri /
stats realm Haproxy\ Statistics
stats auth haproxy:monmotdepasse
stats refresh 10s
frontend sites
bind IP_Externe:80 alpn h2,h2c,http/1.1
default_backend web
# Access log
log 127.0.0.1 local6
option httplog
tcp-request inspect-delay 5s
# forward header
option forwardfor
# Backends
backend web
balance roundrobin
server web01 192.168.33.11:80 check
server web02 192.168.33.12:80 check
Paramètres généraux
Dans la partie global
: gestion des logs, des utilisateurs et du chroot.
Dans la partie defaults
:
- mode http : configuration pour un load balancer par défaut en http, il sera possible de changer ce mode pour des frontend particuliers
- errorfile : quelques fichiers par défaut pour les pages d'erreurs typiques, c'est adaptable
- timeout : une série de configuration pour différents timeout
Frontend stats
C'est le frontend qui permet d'accéder à l'interface de stats de HaProxy, configuré ici sur un port en particulier (à sécuriser).
Frontend sites
bind
: on écoute ici sur l'ip publique du serveur sur le port 80 avec quelques options pour les différentes versions du protocole http- option
forwardfor
: pour renvoyer vers les backend l'IP source dans les headers
Backend web
Configuration d'un backend en Round-robin vers deux serveurs.
Redémarrage
Reste plus qu'à redémarrer et vérifier que cela fonctionne.
Frontend de stats
Voici ce que cela peut donner
Les logs
Un exemple de logs :
2023-08-10T10:57:44.774297+02:00 ha-lb02 haproxy[248912]: ip_client:56482 [10/Aug/2023:10:57:44.773] stats stats/<STATS> 0/0/0/0/0 200 21683 - - LR-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
2023-08-10T10:57:45.866177+02:00 ha-lb02 haproxy[248912]: ip_client:39822 [10/Aug/2023:10:57:45.864] sites web/web02 0/0/0/1/1 200 1159 - - ---- 2/1/0/0/0 0/0 "GET / HTTP/1.1"
2023-08-10T10:57:47.600927+02:00 ha-lb02 haproxy[248912]: ip_client:39822 [10/Aug/2023:10:57:47.599] sites web/web01 0/0/0/1/1 200 1159 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"