RousselTMLEARNING

Article · HAProxy: from discovery to expertise

Session persistence (stickiness)

This article is available in French.

1. Persistance par Cookie #

La méthode la plus fiable pour les applications HTTP.

Insertion de Cookie #

HAProxy insère un cookie dans la réponse du serveur. Au retour, il lit ce cookie pour savoir vers quel serveur diriger la requête.

backend app_servers
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server s1 10.0.0.1:80 check cookie s1
    server s2 10.0.0.2:80 check cookie s2

2. Persistance par IP Source #

Utilisée quand l'application ne gère pas les cookies ou pour du trafic non-HTTP.

L'algorithme source #

L'IP de l'utilisateur est hachée pour désigner un serveur. Simple, mais problématique si beaucoup d'utilisateurs partagent la même IP (ex: entreprise via un proxy).

backend app_servers
    balance source
    server s1 10.0.0.1:80 check

3. Les Stick-Tables #

La mémoire interne de HAProxy pour une persistance avancée.

Stockage en mémoire #

Les stick-tables permettent de stocker des informations (IP, ID de session) et de les partager entre plusieurs nœuds HAProxy via Peers.

backend myapp
    stick-table type ip size 100k expire 30m
    stick on src

Conclusion #

Maintenir l'état utilisateur.

Choisir la bonne méthode #

Le cookie est privilégié pour le Web, tandis que l'IP source ou les stick-tables sont indispensables pour les flux persistants complexes (TCP, RDP, etc.).

Mise en pratique : configurer la persistance #

Cookies, stick-tables et tests.

Persistance par cookie #

backend app
    balance roundrobin
    cookie SRV insert indirect nocache httponly secure
    server web1 10.0.0.11:8080 check cookie s1
    server web2 10.0.0.12:8080 check cookie s2
curl -sI https://app.exemple.fr | grep -i set-cookie            # Set-Cookie: SRV=s1; ...
for i in 1 2 3 4; do curl -s -b "SRV=s2" https://app.exemple.fr/hostname; done   # toujours web2

Persistance par adresse IP avec stick-table #

backend app
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server web1 10.0.0.11:8080 check
    server web2 10.0.0.12:8080 check
echo "show table app" | sudo socat stdio /var/run/haproxy.sock     # entrées de la table
echo "clear table app key 203.0.113.7" | sudo socat stdio /var/run/haproxy.sock
Erreur Courante : Derrière un CDN ou un proxy, src est l'adresse du proxy : utilisez stick on req.hdr_ip(X-Forwarded-For,-1) ou un cookie applicatif pour éviter de tout envoyer sur le même serveur.

📄 Persistance de session (Stickiness) ↗

My progress

  • ⏱ Estimated time : ≈ 13 min

Sign in to track your progress and take notes. Sign in

✉️ Ask a question