6

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 ではそれらを無視するようです。繋がり。その結果、認証リクエストとソケット接続が別のサーバーで終了することがありますが、これは私たちのアプリケーションでは受け入れられません。

この望ましい動作を実現する方法はありますか?

4

5 に答える 5

9

私はこのようにクッキーベースのバランシングを使用しています:

backend socketio
    mode http
    cookie SIO insert
    server sock1 127.0.0.1:8001 cookie 001
    server sock2 127.0.0.1:8002 cookie 002
于 2011-11-29T00:16:30.300 に答える
3

TCP 接続のバランスをとるには、stick_matchまたはstick onコマンドを使用して明示的に tcp モードを設定するスティッキ テーブルである程度成功する場合があります。

次に例を示します。

# forward SMTP users to the same server they just used for POP in the
# last 30 minutes
backend pop
    mode tcp
    balance roundrobin
    stick store-request src
    stick-table type ip size 200k expire 30m
    server s1 192.168.1.1:110
    server s2 192.168.1.1:110

backend smtp
    mode tcp
    balance roundrobin
    stick match src table pop
    server s1 192.168.1.1:25
    server s2 192.168.1.1:25

完全なドキュメントはこちらから入手できます。

于 2011-11-21T03:20:59.603 に答える
0

を使用して websocket 接続のバランスを取りroundrobinます。双方向ソケット (TCP 経由) であるため、デフォルトでスティッキー性が維持されます。その他のトランスポートsourceでは、バランシング アルゴリズムを使用するのが最善の方法です。(Cookie ベースの永続性を使用できますが、socket.io は JSESSIONID などをプロキシ サーバーに送り返しません。Cookie ベースの永続性が必要な場合は、sockjsを試すことができます。)

例:

#do the same for other transports. [Note in 0.6.x resource was mounted at path: /socket.io/[transport]
acl is_JSONPolling path_beg /socket.io/1/jsonp-polling
use_backend non_websocket if is_JSONPolling


backend non_websocket
  balance source
  #rest same as the one for websocket backend
于 2011-11-16T10:29:26.793 に答える
0

HTTP を使用しているので、永続化のために Cookie を挿入します。これが間違いなく最善の方法です。これにより、ダウンしていない限り、最初にアクセスしたサーバーに固定されます。

ダウンしている場合などに再送信するかどうかを構成することもできます。

于 2011-11-30T07:10:03.113 に答える