Il problema
Sto usando haproxy per caricare i server web di bilanciamento. Uso la persistenza della sessione con cookie aggiuntivi poiché alcune applicazioni utilizzano file di sessione e questi non sono sincronizzati tra i server.
Voglio disabilitare un server per la manutenzione, ma senza interrompere le sessioni. Quindi vorrei consentire ai client esistenti di continuare la loro sessione di applicazione, ma non accettare nuovi client.
comportamento haproxy
- Ho impostato un server su "andare in manutenzione"
- se un client ha il cookie impostato, utilizzare il server anche se contrassegnato come "in manutenzione"
- se arriva un nuovo client (senza cookie), viene indirizzato a un altro server
- dopo che tutti i client hanno terminato le loro sessioni applicative, nessun client avrebbe impostato il cookie su questo particolare server e sarei bravo a spegnerlo senza l'interruzione dell'utente.
Pensi che ciò sia realizzabile con una configurazione haproxy? O c'è un modo intelligente per farlo?
Altri modi
Elenco non esaustivo di altri modi per soddisfare questa esigenza:
- sincronizzare i file di sessione tra server (è necessario un modo per sincronizzare i file tra più server o un singolo mountpoint comune)
- utilizzare il database per memorizzare le informazioni sulla sessione (è necessario modificare il comportamento dell'applicazione)
Più dettagli
Uso questo tipo di configurazione:
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
Se disabilito solo SRV1 (con il comando haproxy cli), penso che tutte le sessioni dell'applicazione aperte su SRV1 si interrompano dopo la fine dell'attuale "sessione" HTTP. È giusto?