SV03 - HAProxy : reverse proxy et répartition de charge
Objectif
Placer HAProxy devant un ou plusieurs serveurs web : un seul point d’entrée, répartition de la charge, vérification de santé des serveurs, et masquage du réseau interne.
1. Principe
flowchart LR C1["Client"] & C2["Client"] & C3["Client"] --> H["HAProxy<br/>frontend :80"] H -->|"backend web_backend<br/>(balance roundrobin / leastconn)"| W1["web1 172.30.16.2:80 ✅"] H --> W2["web2 172.30.16.3:80 ✅"] H -.->|"health check KO → retiré"| W3["web3 172.30.16.4:80 ❌"]
| Terme | Sens |
|---|---|
| frontend | Ce qui reçoit les connexions (IP:port d’écoute) |
| backend | Le groupe de serveurs réels |
balance | Algorithme de répartition |
check | Vérification régulière que le serveur répond |
option forwardfor | Ajoute l’en-tête X-Forwarded-For (vraie IP du client, sinon le serveur web ne voit que l’IP de HAProxy) |
| Algorithme | Choix du serveur |
|---|---|
roundrobin | Chacun son tour |
leastconn | Celui qui a le moins de connexions (celui du projet) |
source | Toujours le même serveur pour une IP donnée (sessions) |
2. Installation et configuration (projet transversal)
sudo apt install haproxy # Arch : sudo pacman -S haproxy
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.origine
sudo nano /etc/haproxy/haproxy.cfgglobal
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
timeout connect 5s
timeout client 50s
timeout server 50s
frontend web
bind *:80
default_backend web_backend
backend web_backend
balance leastconn
option forwardfor
option httpchk GET / # santé : le serveur doit répondre en HTTP
server web1 172.30.16.2:80 check
# server web2 172.30.16.3:80 check # ajouter un 2e serveur = 1 ligne
# Page de statistiques (protégée par mot de passe)
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:ChangeMoi!sudo haproxy -c -f /etc/haproxy/haproxy.cfg # vérifier la configuration
sudo systemctl enable --now haproxy
sudo systemctl reload haproxy # après chaque modification
curl -I http://172.16.118.6 # depuis le réseau laboStatistiques : http://172.16.118.6:8404/stats (n’ouvre pas ce port au public).
3. Dépannage
| Symptôme | Piste |
|---|---|
503 Service Unavailable | Tous les serveurs du backend sont « DOWN » → le serveur web répond-il ? curl http://172.30.16.2 depuis le routeur |
| HAProxy ne démarre pas | haproxy -c -f … ; port 80 déjà pris par un Apache local (ss -tlnp | grep :80) |
| Les logs Apache ne montrent que l’IP du routeur | Utiliser X-Forwarded-For (module remoteip d’Apache) |
| Journaux | journalctl -u haproxy -f |
4. Aller plus loin
- HTTPS :
bind *:443 ssl crt /etc/haproxy/certs/site.pem(certificat + clé concaténés) ethttp-request redirect scheme https unless { ssl_fc }. - Haute disponibilité de HAProxy lui-même : 2 HAProxy + Keepalived (IP virtuelle) → R07 - Redondance des passerelles (HSRP, CARP, Keepalived).
- Alternatives : Nginx (reverse proxy + serveur web), Traefik (conteneurs), HAProxy intégré à pfSense (paquet).
Voir aussi
- SV02 - WordPress en architecture 3 tiers · S04 - Proxy Squid et SquidGuard (proxy « direct », l’inverse du reverse proxy)
- Retour : 00 - Index général