TL;DR — Résumé Rapide
Guide complet HAProxy pour l'équilibrage de charge TCP et HTTP avec haute disponibilité. ACLs, health checks, SSL, stick tables et failover keepalived VRRP.
HAProxy est l’implémentation de référence pour l’équilibrage de charge open source. Là où Nginx sert également de serveur web et Caddy privilégie la facilité d’utilisation, HAProxy est conçu spécifiquement pour le proxy et l’équilibrage de charge — et cela se voit dans chaque benchmark. Ce guide couvre la stack complète de HAProxy : architecture, installation sur Ubuntu et RHEL, réglage de global et defaults, configuration frontend/backend avec ACLs, tous les algorithmes d’équilibrage, health checks TCP et HTTP, terminaison SSL/TLS, la page de statistiques, stick tables, rate limiting, intégration rsyslog, et une configuration complète keepalived VRRP pour la haute disponibilité à deux nœuds.
Prérequis
Avant de commencer, assurez-vous d’avoir :
- Ubuntu 22.04/24.04 ou RHEL 9/AlmaLinux 9 avec accès sudo
- Au moins deux serveurs d’application backend
- Deux nœuds HAProxy (pour la section haute disponibilité avec keepalived)
- Notions de base en TCP/IP et HTTP
- HAProxy 2.6 ou ultérieur (version LTS recommandée)
Architecture de HAProxy
HAProxy s’exécute comme un processus unique orienté événements (ou un nombre configurable de processus/threads). Toutes les E/S sont non bloquantes et multiplexées, permettant à HAProxy de gérer des dizaines de milliers de connexions simultanées avec une RAM minimale.
Un fichier de configuration comporte quatre types de sections principaux :
- global — paramètres globaux du processus (maxconn, log, chroot, user/group, nbthread)
- defaults — paramètres par défaut hérités par tous les frontends et backends
- frontend — écoute les connexions entrantes ; applique les ACLs et route le trafic vers les backends
- backend — définit le pool de serveurs, l’algorithme d’équilibrage et les paramètres de health check
- listen — combinaison frontend+backend, utile pour la page de statistiques ou les proxies TCP simples
Le flux du trafic est : client → frontend → évaluation des ACLs → règle use_backend → backend → serveur.
Installation
Ubuntu / Debian
sudo apt update
sudo apt install haproxy -y
haproxy -v
Pour une version LTS plus récente, ajoutez le PPA officiel :
sudo add-apt-repository ppa:vbernat/haproxy-2.8 -y
sudo apt install haproxy=2.8.\* -y
RHEL / AlmaLinux / Rocky Linux
sudo dnf install haproxy -y
haproxy -v
sudo systemctl enable --now haproxy
Configuration Global et Defaults
Ouvrez /etc/haproxy/haproxy.cfg et remplacez le contenu standard par une base prête pour la production :
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 50000
nbthread 4
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
option http-server-close
retries 3
timeout connect 5s
timeout client 30s
timeout server 30s
timeout http-keep-alive 10s
timeout check 5s
maxconn 3000
Paramètres clés expliqués :
maxconn 50000— limite globale de connexions ; ajustez selon la RAM disponible (~1 Mo par 1000 connexions)nbthread 4— exécute quatre threads sur un système quad-coreoption dontlognull— supprime les logs des health checks sans payloadoption forwardfor— injecte l’en-têteX-Forwarded-Fordans les requêtes proxyretries 3— tentatives de reconnexion avant de marquer un serveur comme hors lignetimeout connect 5s— temps maximum pour établir une connexion TCP vers un backend
Configuration du Frontend
Un frontend définit sur quoi HAProxy écoute et où il route le trafic :
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
http-request redirect scheme https unless { ssl_fc }
http-request set-header X-Forwarded-Proto https if { ssl_fc }
# Définition des ACLs
acl is_api path_beg /api/
acl is_static path_beg /static/ /assets/ /images/
acl host_admin hdr(host) -i admin.example.com
# Règles de routage
use_backend api_backend if is_api
use_backend static_backend if is_static
use_backend admin_backend if host_admin
default_backend app_backend
Correspondances d’ACL courantes :
| Correspondance | Exemple | Vérifie |
|---|---|---|
path_beg | path_beg /api/ | URI commence par /api/ |
path_end | path_end .php | URI se termine par .php |
hdr(host) | hdr(host) -i api.example.com | En-tête Host (insensible à la casse) |
src | src 10.0.0.0/8 | Plage IP du client |
method | method POST | Méthode HTTP |
Configuration du Backend
Un backend définit le pool de serveurs et la distribution du trafic :
backend app_backend
balance roundrobin
option httpchk GET /health HTTP/1.1\r\nHost:\ app.example.com
server app1 10.0.0.10:8080 weight 3 maxconn 500 check inter 2s fall 3 rise 2
server app2 10.0.0.11:8080 weight 3 maxconn 500 check inter 2s fall 3 rise 2
server app3 10.0.0.12:8080 weight 1 maxconn 200 check inter 2s fall 3 rise 2
server app_backup 10.0.0.20:8080 backup check inter 5s fall 2 rise 1
Algorithmes d’Équilibrage
| Algorithme | Directive | Idéal pour |
|---|---|---|
| Round-robin | balance roundrobin | Requêtes courtes et uniformes |
| RR pondéré | balance roundrobin + weight N | Serveurs de capacité mixte |
| Moins de connexions | balance leastconn | Temps de réponse variables |
| Hash IP source | balance source | Affinité de session par IP client |
| Hash URI | balance uri | Serveurs de cache |
| Hash d’en-tête | balance hdr(User-Agent) | Routage par en-tête HTTP |
Health Checks
Health Check TCP (par défaut)
HAProxy ouvre une connexion TCP pour vérifier que le port est actif :
backend tcp_backend
balance leastconn
server db1 10.0.0.30:5432 check inter 3s fall 2 rise 1
server db2 10.0.0.31:5432 check inter 3s fall 2 rise 1
Health Check HTTP
Pour les backends HTTP, vérifiez que l’application retourne un code de statut sain :
backend app_backend
option httpchk GET /health HTTP/1.1\r\nHost:\ app.example.com
http-check expect status 200
server app1 10.0.0.10:8080 check inter 2s fall 3 rise 2
server app2 10.0.0.11:8080 check inter 2s fall 3 rise 2
Terminaison SSL/TLS
HAProxy termine SSL sur le frontend et transmet du TCP ou HTTP non chiffré aux backends. Combinez certificat et clé privée dans un seul PEM :
cat fullchain.pem privkey.pem > /etc/haproxy/certs/example.com.pem
chmod 600 /etc/haproxy/certs/example.com.pem
SNI multi-certificats (un répertoire, HAProxy choisit automatiquement le bon certificat) :
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/
http-request set-header X-Forwarded-Proto https
http-response set-header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
default_backend app_backend
Page de Statistiques
La page de statistiques intégrée de HAProxy fournit des métriques de connexion en temps réel :
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:changeme
stats show-legends
stats show-node
stats hide-version
Accédez-y sur http://votre-serveur:8404/stats. Protégez ce port avec une règle de pare-feu :
sudo ufw allow from 10.0.0.0/8 to any port 8404
sudo ufw deny 8404
Stick Tables pour la Persistance de Session
Les stick tables suivent les associations client→serveur en mémoire partagée :
backend app_backend
balance roundrobin
stick-table type ip size 100k expire 30m
stick on src
server app1 10.0.0.10:8080 check
server app2 10.0.0.11:8080 check
Pour la persistance par cookie :
backend app_backend
balance roundrobin
cookie SERVERID insert indirect nocache
server app1 10.0.0.10:8080 cookie app1 check
server app2 10.0.0.11:8080 cookie app2 check
Rate Limiting avec les Stick Tables
Les stick tables de HAProxy gèrent aussi le rate limiting sans dépendances externes :
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/
stick-table type ip size 200k expire 10s store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
default_backend app_backend
Journalisation avec rsyslog
HAProxy journalise sur un socket syslog. Configurez rsyslog pour écrire les logs dans un fichier dédié.
Créez /etc/rsyslog.d/49-haproxy.conf :
$AddUnixListenSocket /dev/log
:programname, startswith, "haproxy" {
/var/log/haproxy.log
stop
}
sudo systemctl restart rsyslog
sudo systemctl restart haproxy
HAProxy avec Keepalived pour le Basculement VRRP
keepalived exécute VRRP pour attribuer une IP virtuelle partagée entre deux nœuds HAProxy. Si le nœud primaire tombe, le nœud de secours prend l’IP virtuelle en une ou deux secondes.
Installer keepalived
sudo apt install keepalived -y # Ubuntu
sudo dnf install keepalived -y # RHEL
Nœud primaire — /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass s3cur3p4ss
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
Nœud de secours — /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass s3cur3p4ss
}
virtual_ipaddress {
192.168.1.100/24
}
}
sudo systemctl enable --now keepalived
ip addr show eth0 | grep 192.168.1.100
Comparatif des Équilibreurs de Charge
| Fonctionnalité | HAProxy | Nginx | Traefik | Envoy | AWS ALB |
|---|---|---|---|---|---|
| Équilibrage TCP | Oui (natif) | Oui | Oui | Oui | Oui |
| Health checks actifs | Oui (intégré) | Plus seulement | Oui | Oui | Oui |
| Interface statistiques | Intégrée | stub_status | Dashboard | Admin API | CloudWatch |
| Rate limiting | Stick tables | limit_req | Middleware | Filters | WAF |
| Terminaison SSL | Oui | Oui | Oui | Oui | Oui |
| HA/VRRP | Via keepalived | Via keepalived | Non intégré | Non intégré | Géré |
| Empreinte ressources | Très faible | Faible | Moyenne | Élevée | Géré |
| Idéal pour | TCP+HTTP HA | Web + cache | Conteneurs | Service mesh | AWS natif |
Résumé
HAProxy est la référence pour l’équilibrage de charge TCP et HTTP dans les environnements Linux. Points clés :
- Ajustez
maxconn,nbthreadet les timeouts dans les sectionsglobaletdefaultsen premier - Construisez des ACLs dans le frontend avec
path_beg,hdr()etsrc; routez vers les backends avecuse_backend - Choisissez
leastconnpour les APIs HTTP,roundrobinpour le trafic uniforme, etsourceou stick tables pour la persistance de session - Ajoutez toujours
check inter 2s fall 3 rise 2à chaque ligne de serveur etoption httpchkaux backends HTTP - Terminez SSL dans le frontend avec un fichier PEM combiné ; plusieurs certificats dans un répertoire pour le SNI automatique
- Utilisez les stick tables pour la persistance de session et le rate limiting sans dépendances externes
- Associez HAProxy à keepalived VRRP pour un basculement en moins d’une seconde entre deux nœuds