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-core
  • option dontlognull — supprime les logs des health checks sans payload
  • option forwardfor — injecte l’en-tête X-Forwarded-For dans les requêtes proxy
  • retries 3 — tentatives de reconnexion avant de marquer un serveur comme hors ligne
  • timeout 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 :

CorrespondanceExempleVérifie
path_begpath_beg /api/URI commence par /api/
path_endpath_end .phpURI se termine par .php
hdr(host)hdr(host) -i api.example.comEn-tête Host (insensible à la casse)
srcsrc 10.0.0.0/8Plage IP du client
methodmethod POSTMé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

AlgorithmeDirectiveIdéal pour
Round-robinbalance roundrobinRequêtes courtes et uniformes
RR pondérébalance roundrobin + weight NServeurs de capacité mixte
Moins de connexionsbalance leastconnTemps de réponse variables
Hash IP sourcebalance sourceAffinité de session par IP client
Hash URIbalance uriServeurs de cache
Hash d’en-têtebalance 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éHAProxyNginxTraefikEnvoyAWS ALB
Équilibrage TCPOui (natif)OuiOuiOuiOui
Health checks actifsOui (intégré)Plus seulementOuiOuiOui
Interface statistiquesIntégréestub_statusDashboardAdmin APICloudWatch
Rate limitingStick tableslimit_reqMiddlewareFiltersWAF
Terminaison SSLOuiOuiOuiOuiOui
HA/VRRPVia keepalivedVia keepalivedNon intégréNon intégréGéré
Empreinte ressourcesTrès faibleFaibleMoyenneÉlevéeGéré
Idéal pourTCP+HTTP HAWeb + cacheConteneursService meshAWS 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, nbthread et les timeouts dans les sections global et defaults en premier
  • Construisez des ACLs dans le frontend avec path_beg, hdr() et src ; routez vers les backends avec use_backend
  • Choisissez leastconn pour les APIs HTTP, roundrobin pour le trafic uniforme, et source ou stick tables pour la persistance de session
  • Ajoutez toujours check inter 2s fall 3 rise 2 à chaque ligne de serveur et option httpchk aux 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

Articles Connexes