Ho diverse istanze di socket.io con autenticazione in esecuzione in HAProxy e devo forzare che la richiesta di autenticazione e la connessione socket passino alla stessa istanza. Ho installato HAProxy sulla base di this answer to a SO question con alcune modifiche come in:Posso avere sessioni persistenti con HAProxy e socket.io con autenticazione?
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 2
defaults
mode http
frontend all 0.0.0.0:80
timeout client 86400000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend if is_websocket
backend www_backend
balance url_param sessionId
option forwardfor # This sets X-Forwarded-For
timeout server 30000
timeout connect 4000
server server1 localhost:8081 weight 1 maxconn 1024 check
server server2 localhost:8082 weight 1 maxconn 1024 check
server server3 localhost:8083 weight 1 maxconn 1024 check
backend socket_backend
balance url_param sessionId
option forwardfor # This sets X-Forwarded-For
timeout queue 5000
timeout server 86400000
timeout connect 86400000
server server1 localhost:8081 weight 1 maxconn 1024 check
server server2 localhost:8082 weight 1 maxconn 1024 check
server server3 localhost:8083 weight 1 maxconn 1024 check
che ho provato url_param (dove sessionId è un parametro querystring passato sia la chiamata di autenticazione e la connessione websocket) e la fonte a titolo di saldo opzioni, ma sembra che HAProxy consenta solo queste opzioni per le connessioni HTTP e quindi le ignori per la connessione websocket effettiva. Il risultato è che a volte la richiesta di autenticazione e la connessione socket finiscono in server diversi, il che è inaccettabile per la nostra applicazione.
C'è un modo per avere questo comportamento desiderato?
Hai mai capire il modo migliore per farlo? Stavo cercando di fare la stessa cosa. Grazie. –
Ho finito per usare il bilanciamento dell'hash IP. Tutte le richieste dallo stesso IP vanno allo stesso server – Diego
O ok, ma ciò significa che un websocket trasmesso da un utente sul server A non raggiunge nessuno degli utenti sul server B? –