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 ❌"]
TermeSens
frontendCe qui reçoit les connexions (IP:port d’écoute)
backendLe groupe de serveurs réels
balanceAlgorithme de répartition
checkVérification régulière que le serveur répond
option forwardforAjoute l’en-tête X-Forwarded-For (vraie IP du client, sinon le serveur web ne voit que l’IP de HAProxy)
AlgorithmeChoix du serveur
roundrobinChacun son tour
leastconnCelui qui a le moins de connexions (celui du projet)
sourceToujours 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.cfg
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
    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 labo

Statistiques : http://172.16.118.6:8404/stats (n’ouvre pas ce port au public).

3. Dépannage

SymptômePiste
503 Service UnavailableTous 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 pashaproxy -c -f … ; port 80 déjà pris par un Apache local (ss -tlnp | grep :80)
Les logs Apache ne montrent que l’IP du routeurUtiliser X-Forwarded-For (module remoteip d’Apache)
Journauxjournalctl -u haproxy -f

4. Aller plus loin

  • HTTPS : bind *:443 ssl crt /etc/haproxy/certs/site.pem (certificat + clé concaténés) et http-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