Tengo varias instancias de socket.io con autenticación ejecutándose bajo HAProxy y necesito forzar que la solicitud de autenticación y la conexión de socket vayan a la misma instancia. He creado HAProxy basado en this answer to a SO question con algunas modificaciones como así:¿Puedo tener sesiones fijas con HAProxy y socket.io con autenticación?
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
que he probado url_param (donde sessionId es un parámetro de cadena de consulta aprobada en tanto la llamada de autenticación y la conexión WebSocket) y la fuente como el equilibrio opciones pero parece que HAProxy solo permite estas opciones para las conexiones HTTP y, por lo tanto, las ignora para la conexión websocket real. El resultado es que a veces la solicitud de autenticación y la conexión del socket terminan en diferentes servidores, lo cual es inaceptable para nuestra aplicación.
¿Hay alguna manera de tener este comportamiento deseado?
¿Alguna vez de averiguar la mejor manera de hacer esto? Estaba buscando hacer lo mismo. Gracias. –
Terminé usando el equilibrio IP-hash. Todas las solicitudes de la misma IP van al mismo servidor – Diego
O ok, pero ¿eso significa que un websocket que se transmite desde un usuario en el servidor A no llega a ninguno de los usuarios en el servidor B? –