
Ce guide vous permet de déployer HAProxy pour répartir le trafic HTTP entre plusieurs serveurs backend. Vous apprendrez à configurer le load balancing round-robin, les health checks automatiques, les sticky sessions et la protection contre les abus. À la fin, vous disposerez d’un reverse proxy prêt pour la production.
Public cible : administrateurs système, DevOps, développeurs souhaitant améliorer la disponibilité de leurs applications.
Prérequis : un système Linux (Ubuntu/Debian) avec accès root, et au moins deux serveurs backend (ou containers Docker).
Qu’est-ce que HAProxy ?
Section intitulée « Qu’est-ce que HAProxy ? »HAProxy (High Availability Proxy) est un répartiteur de charge (load balancer) et reverse proxy open source. Créé en 2000 par Willy Tarreau, il est utilisé par des entreprises comme GitHub, Reddit et Netflix pour gérer des millions de connexions simultanées.
Analogie : imaginez un standardiste téléphonique qui reçoit tous les appels entrants et les distribue aux différents opérateurs disponibles. HAProxy joue ce rôle pour vos serveurs web : il reçoit les requêtes des utilisateurs et les répartit intelligemment entre vos serveurs.
Pourquoi utiliser HAProxy ?
| Sans HAProxy | Avec HAProxy |
|---|---|
| Un seul serveur reçoit tout le trafic | Le trafic est réparti entre plusieurs serveurs |
| Si le serveur tombe, le site est indisponible | Le trafic bascule automatiquement vers les serveurs sains |
| Pas de protection contre les pics de charge | Gestion des files d’attente et rate limiting |
| Configuration SSL sur chaque serveur | Terminaison SSL centralisée |
Prérequis
Section intitulée « Prérequis »Installation de HAProxy 3.0 LTS
Section intitulée « Installation de HAProxy 3.0 LTS »La version 3.0 est une version LTS (Long Term Support) maintenue jusqu’en 2029. Elle apporte de nombreuses améliorations en termes de sécurité, performance et configuration.
Pour obtenir la dernière version stable (recommandé) :
-
Ajoutez le PPA officiel HAProxy maintenu par Vincent Bernat :
Fenêtre de terminal sudo add-apt-repository -y ppa:vbernat/haproxy-3.0sudo apt update -
Installez HAProxy :
Fenêtre de terminal sudo apt install -y haproxy -
Vérifiez l’installation :
Fenêtre de terminal haproxy -vVous devriez voir :
HAProxy version 3.0.15-1ppa1~noble 2026/01/31 - https://haproxy.org/Status: long-term supported branch - will stop receiving fixes around Q2 2029.
-
Installez les dépendances :
Fenêtre de terminal sudo dnf install -y epel-releasesudo dnf update -
Installez HAProxy :
Fenêtre de terminal sudo dnf install -y haproxy -
Vérifiez l’installation :
Fenêtre de terminal haproxy -v
Concepts clés de HAProxy
Section intitulée « Concepts clés de HAProxy »Avant de configurer HAProxy, comprenons les briques fondamentales de son architecture.
Frontend, Backend et Listen
Section intitulée « Frontend, Backend et Listen »HAProxy utilise trois types de blocs de configuration :
| Bloc | Rôle | Analogie |
|---|---|---|
| frontend | Point d’entrée qui reçoit les connexions clients | L’accueil d’un hôtel |
| backend | Groupe de serveurs qui traitent les requêtes | Les chambres disponibles |
| listen | Combine frontend + backend en un seul bloc | Un hôtel simple avec accueil intégré |
┌──────────────────────────────────────────────────────────────┐│ HAProxy ││ ┌─────────────┐ ┌─────────────────────────────┐ ││ │ Frontend │ │ Backend │ ││ │ (port 80) │──────────▶│ ┌──────┐ ┌──────┐ │ ││ │ │ │ │Web 1 │ │Web 2 │ ... │ ││ └─────────────┘ │ └──────┘ └──────┘ │ ││ └─────────────────────────────┘ │└──────────────────────────────────────────────────────────────┘Algorithmes de répartition de charge
Section intitulée « Algorithmes de répartition de charge »HAProxy propose plusieurs méthodes pour distribuer le trafic :
| Algorithme | Description | Cas d’usage |
|---|---|---|
roundrobin | Distribue les requêtes à tour de rôle | Serveurs identiques, charge équilibrée |
leastconn | Envoie vers le serveur avec le moins de connexions | Requêtes longues (téléchargements, WebSocket) |
source | Hash basé sur l’IP source (sticky) | Affinité de session sans cookie |
uri | Hash basé sur l’URI | Cache distribué |
random | Sélection aléatoire | Simple et efficace à grande échelle |
ACLs (Access Control Lists)
Section intitulée « ACLs (Access Control Lists) »Les ACLs permettent de prendre des décisions de routage basées sur des conditions :
acl is_api path_beg /api # Vrai si le chemin commence par /apiacl is_admin hdr(host) -i admin.example.com # Vrai si Host = admin...
use_backend api_servers if is_apiuse_backend admin_servers if is_admindefault_backend web_serversTypes de conditions courantes :
| Condition | Description |
|---|---|
path_beg /api | Le chemin commence par “/api” |
path_end .jpg | Le chemin finit par “.jpg” |
hdr(host) -i example.com | L’en-tête Host vaut “example.com” |
src 192.168.1.0/24 | L’IP source est dans ce sous-réseau |
Health Checks
Section intitulée « Health Checks »Les health checks vérifient automatiquement que vos serveurs backend fonctionnent :
- TCP check : vérifie que le port répond (par défaut)
- HTTP check : envoie une requête HTTP et attend un code 200
- Si un serveur ne répond pas, HAProxy le retire automatiquement du pool
Configuration de base
Section intitulée « Configuration de base »Le fichier de configuration principal est /etc/haproxy/haproxy.cfg. Voici une configuration minimale fonctionnelle :
global log /dev/log local0 log /dev/log local1 notice maxconn 4096 user haproxy group haproxy daemon
defaults mode http log global option httplog option dontlognull timeout connect 5s timeout client 30s timeout server 30s timeout http-request 10s
# Page de statistiqueslisten stats bind *:8404 stats enable stats uri /stats stats refresh 10s stats admin if LOCALHOST
# Frontend HTTPfrontend http_front bind *:80 default_backend web_backend
# Backend avec load balancingbackend web_backend balance roundrobin option httpchk GET /health http-check expect status 200 server web1 192.168.1.10:80 check server web2 192.168.1.11:80 checkValidation et démarrage
Section intitulée « Validation et démarrage »Avant d’appliquer une configuration, toujours la valider :
# Vérifie la syntaxesudo haproxy -c -f /etc/haproxy/haproxy.cfgSi aucune erreur n’est affichée, la configuration est valide.
# Démarrer le servicesudo systemctl enable haproxysudo systemctl start haproxy
# Vérifier le statutsudo systemctl status haproxyVérification
Section intitulée « Vérification »Testez que le load balancing fonctionne :
# Envoyez plusieurs requêtesfor i in {1..4}; do curl -s http://localhost/ | head -1; doneVous devriez voir les réponses alterner entre vos backends.
Accédez à la page de statistiques : http://votre-ip:8404/stats
Cas pratiques avancés
Section intitulée « Cas pratiques avancés »Sticky Sessions (sessions persistantes)
Section intitulée « Sticky Sessions (sessions persistantes) »Les sticky sessions garantissent qu’un utilisateur est toujours renvoyé vers le même serveur backend. Indispensable pour les applications qui stockent l’état de session côté serveur.
backend web_backend balance roundrobin cookie SERVERID insert indirect nocache server web1 192.168.1.10:80 check cookie web1 server web2 192.168.1.11:80 check cookie web2Comment ça fonctionne :
- À la première connexion, HAProxy choisit un serveur (ex: web1)
- Il ajoute un cookie
SERVERID=web1dans la réponse - Les requêtes suivantes avec ce cookie vont toujours vers web1
Vérification :
# Première requête : récupère le cookiecurl -c cookies.txt http://localhost/
# Requêtes suivantes : utilise le cookie (même serveur)curl -b cookies.txt http://localhost/curl -b cookies.txt http://localhost/Routage basé sur l’URL (Path-based routing)
Section intitulée « Routage basé sur l’URL (Path-based routing) »Envoyez différents types de requêtes vers différents backends :
frontend http_front bind *:80
# Définition des ACLs acl is_api path_beg /api acl is_static path_beg /static /images /css /js acl is_websocket hdr(Upgrade) -i WebSocket
# Routage vers les backends appropriés use_backend api_backend if is_api use_backend static_backend if is_static use_backend websocket_backend if is_websocket default_backend web_backend
backend api_backend balance leastconn server api1 192.168.1.20:3000 check server api2 192.168.1.21:3000 check
backend static_backend balance roundrobin server static1 192.168.1.30:80 check
backend websocket_backend balance source option http-server-close server ws1 192.168.1.40:8080 checkHealth Checks HTTP personnalisés
Section intitulée « Health Checks HTTP personnalisés »Configurez des vérifications de santé plus précises :
backend web_backend balance roundrobin
# Vérifie l'endpoint /health option httpchk GET /health HTTP/1.1\r\nHost:\ localhost
# Attend un code 200 http-check expect status 200
# Ou vérifie le contenu de la réponse # http-check expect string "status":"healthy"
# Paramètres des checks server web1 192.168.1.10:80 check inter 5s fall 3 rise 2 server web2 192.168.1.11:80 check inter 5s fall 3 rise 2Paramètres des serveurs :
| Paramètre | Description |
|---|---|
check | Active les health checks |
inter 5s | Intervalle entre les checks (5 secondes) |
fall 3 | Nombre d’échecs avant de considérer le serveur DOWN |
rise 2 | Nombre de succès pour remettre le serveur UP |
Terminaison SSL/TLS
Section intitulée « Terminaison SSL/TLS »HAProxy peut gérer le chiffrement SSL à la place de vos backends :
frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1 bind *:80
# Redirige HTTP vers HTTPS http-request redirect scheme https unless { ssl_fc }
# Ajoute l'en-tête X-Forwarded-Proto http-request set-header X-Forwarded-Proto https if { ssl_fc }
default_backend web_backend
backend web_backend balance roundrobin server web1 192.168.1.10:80 check server web2 192.168.1.11:80 checkSécurisation de HAProxy
Section intitulée « Sécurisation de HAProxy »Rate Limiting (limitation de requêtes)
Section intitulée « Rate Limiting (limitation de requêtes) »Protégez vos backends contre les abus et les attaques DDoS :
frontend http_front bind *:80
# Table de suivi des requêtes par IP stick-table type ip size 100k expire 30s store http_req_rate(10s)
# Comptabilise les requêtes par IP http-request track-sc0 src
# Bloque si plus de 50 requêtes en 10 secondes http-request deny deny_status 429 if { sc_http_req_rate(0) gt 50 }
default_backend web_backendExplication :
stick-table: crée une table pour stocker les compteurs par IPtrack-sc0: associe chaque requête à son IP sourcedeny_status 429: renvoie “Too Many Requests” si la limite est dépassée
Headers de sécurité
Section intitulée « Headers de sécurité »Ajoutez des en-têtes de sécurité aux réponses :
frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem
# Headers de sécurité http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains" http-response set-header X-Frame-Options "SAMEORIGIN" http-response set-header X-Content-Type-Options "nosniff" http-response set-header X-XSS-Protection "1; mode=block"
default_backend web_backendBloquer des IPs malveillantes
Section intitulée « Bloquer des IPs malveillantes »Utilisez une ACL pour bloquer des IPs spécifiques :
frontend http_front bind *:80
# Liste noire d'IPs (fichier externe) acl blocked_ips src -f /etc/haproxy/blocked_ips.txt http-request deny if blocked_ips
default_backend web_backendContenu de /etc/haproxy/blocked_ips.txt :
192.168.1.10010.0.0.0/8Monitoring et logs
Section intitulée « Monitoring et logs »Page de statistiques
Section intitulée « Page de statistiques »La page de stats intégrée fournit une vue en temps réel :
listen stats bind *:8404 stats enable stats uri /stats stats refresh 10s stats show-legends stats show-node stats admin if LOCALHOSTAccédez à http://votre-ip:8404/stats pour voir :
- L’état de chaque backend (UP/DOWN)
- Le nombre de connexions actives
- Les taux de requêtes
- Les temps de réponse
Logs au format JSON (HAProxy 3.0+)
Section intitulée « Logs au format JSON (HAProxy 3.0+) »HAProxy 3.0 permet de formater les logs en JSON pour une meilleure intégration avec des outils comme ELK ou Loki :
defaults mode http log-format "%{+json}o %(client_ip)ci %(status)ST %(bytes)B %(duration)Ta %(backend)b %(server)s"Intégration Prometheus
Section intitulée « Intégration Prometheus »Exposez des métriques au format Prometheus :
frontend prometheus bind *:8405 http-request use-service prometheus-exporter if { path /metrics } stats enable stats uri /statsConfigurez ensuite Prometheus pour scraper http://haproxy:8405/metrics.
Dépannage
Section intitulée « Dépannage »Problèmes courants
Section intitulée « Problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
| ”bind: cannot bind socket” | Port déjà utilisé | Vérifiez avec ss -tlnp | grep 80 |
| Serveur DOWN dans les stats | Health check échoue | Vérifiez que l’endpoint /health répond 200 |
| Pas de load balancing | Un seul serveur UP | Vérifiez les health checks des autres serveurs |
| Erreur 503 | Tous les serveurs DOWN | Vérifiez la connectivité réseau aux backends |
| Cookie de session qui change | Mauvaise config cookie | Vérifiez le paramètre cookie sur chaque server |
Commandes utiles
Section intitulée « Commandes utiles »# Vérifier la configurationsudo haproxy -c -f /etc/haproxy/haproxy.cfg
# Recharger sans interruption (hitless reload)sudo systemctl reload haproxy
# Voir les logs en temps réelsudo journalctl -u haproxy -f
# Vérifier les ports d'écoutess -tlnp | grep haproxy
# Tester une requête avec verbosecurl -v http://localhost/Mode diagnostic (HAProxy 3.0+)
Section intitulée « Mode diagnostic (HAProxy 3.0+) »Lancez HAProxy en mode diagnostic pour détecter les problèmes de configuration :
haproxy -dD -f /etc/haproxy/haproxy.cfgCette option signale les directives problématiques sans empêcher le démarrage.
À retenir
Section intitulée « À retenir »-
HAProxy est un reverse proxy et load balancer qui répartit le trafic entre plusieurs serveurs pour assurer haute disponibilité et performance.
-
Les blocs frontend/backend séparent la réception du trafic (frontend) de sa distribution (backend).
-
Les health checks retirent automatiquement les serveurs défaillants du pool — toujours les activer avec
check. -
Les sticky sessions (cookies) maintiennent l’affinité client-serveur pour les applications avec état.
-
Le rate limiting protège vos backends contre les abus — configurez une
stick-tableavec des limites raisonnables. -
Validez toujours la configuration avec
haproxy -cavant de recharger. -
La page de statistiques (port 8404) donne une vue temps réel de l’état de votre infrastructure.