Le problème
J'utilise haproxy pour équilibrer la charge des serveurs Web. J'utilise la persistance de session avec des cookies supplémentaires car certaines applications utilisent des fichiers de session et ceux-ci ne sont pas synchronisés entre les serveurs.
Je souhaite désactiver un serveur pour la maintenance, mais sans interrompre les sessions. Je voudrais donc autoriser les clients existants à poursuivre leur session d'application, mais ne pas accepter de nouveaux clients.
comportement haproxy
- J'ai configuré un serveur pour "passer en maintenance"
- si un client a défini le cookie, utilisez le serveur même s'il est marqué comme "en cours de maintenance"
- si un nouveau client (sans cookie) arrive, il est dirigé vers un autre serveur
- une fois que tous les clients ont terminé leurs sessions d'application, plus aucun client n'aurait le cookie défini sur ce serveur particulier, et je serais bien de le fermer sans interruption de l'utilisateur.
Pensez-vous que cela soit réalisable avec une configuration haproxy? Ou existe-t-il un moyen intelligent de le faire?
D'autres moyens
Liste non exhaustive d'autres moyens de répondre à ce besoin:
- synchroniser les fichiers de session entre les serveurs (nécessite un moyen de synchroniser les fichiers entre plusieurs serveurs ou un point de montage unique commun)
- utiliser la base de données pour stocker les informations de session (doit changer le comportement de l'application)
Plus de détails
J'utilise ce type de configuration:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
Si je désactive juste SRV1 (avec la commande haproxy cli), je pense que toutes les sessions d'application ouvertes sur SRV1 se briseront après la fin de la "session" HTTP actuelle. Est-ce correct?