HAProxy で認証を実行する socket.io のインスタンスがいくつかあり、認証要求とソケット接続が同じインスタンスに送られるようにする必要があります。SOの質問に対するこの回答に基づいて、いくつかの変更を加えてHAProxyをセットアップしました。
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
url_param (sessionId は認証呼び出しと websocket 接続の両方で渡されるクエリ文字列パラメーター) と source をバランス オプションとして試しましたが、HAProxy は HTTP 接続に対してのみこれらのオプションを許可し、実際の websocket ではそれらを無視するようです。繋がり。その結果、認証リクエストとソケット接続が別のサーバーで終了することがありますが、これは私たちのアプリケーションでは受け入れられません。
この望ましい動作を実現する方法はありますか?