web-dev-qa-db-ja.com

HAProxy + WebSocket切断

HAProxyを使用して、サブドメインのリクエストをnode.jsアプリに送信しています。

WebSocketを機能させることができません。これまでのところ、クライアントにWebSocket接続を確立させることしかできませんでしたが、その後すぐに切断が発生します。

私はubuntuにいます。さまざまなバージョンのsocket.ioおよびnode-websocket-server。クライアントは、SafariまたはChromeの最新バージョンです。 HAProxyバージョンは1.4.8

これが私のHAProxy.cfgです

global 
    maxconn 4096 
    pidfile /var/run/haproxy.pid 
    daemon 

defaults 
    mode http 

    maxconn 2000 

    option http-server-close
    option http-pretend-keepalive

    contimeout      5000
    clitimeout      50000
    srvtimeout      50000

frontend HTTP_PROXY
    bind *:80 

    timeout client  86400000

    #default server
    default_backend NGINX_SERVERS

    #node server
    acl Host_node_sockettest hdr_beg(Host) -i mysubdomain.mydomain

use_backend NODE_SOCKETTEST_SERVERS if Host_node_sockettest


backend NGINX_SERVERS 
server THIS_NGINX_SERVER 127.0.0.1:8081

backend NODE_SOCKETTEST_SERVERS
timeout queue   5000
timeout server  86400000

server THIS_NODE_SERVER localhost:8180 maxconn 200 check

私はウェブとメーリングリストをトロールしましたが、提案された解決策が機能することはありません。

p

43
Ross

Socket.ioの最新バージョンにアップグレードします(0.6.8-> npm install [email protected](HAProxyで動作するようにパッチされています)および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 5000
    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 roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout server 5000
    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 roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout queue 5000
    timeout server 5000
    timeout connect 5000
    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
60
Shripad Krishna

クライアントがWebSocketsバージョン76を使用している可能性があります。この場合、WebSocketsハンドシェイクがHTTPに違反しているため、「モードhttp」を使用できません。 WebSocketsハンドシェイクがHTTPと互換性があるべきかどうかについて、委員会にはあいまいさがありそうです。とにかく、v76ハンドシェイクの問題は、生データがハンドシェイク(チェックサムチャンク)で送信されることです。

関連するHAProxyディスカッション: http://www.mail-archive.com/[email protected]/msg03046.html

議論から、TCPモードにデフォルト設定し、非WebSocket接続のHTTPにフォールバックする方法があるかもしれません。

6
kanaka

Netty実装を使用しています https://github.com/ibdknox/socket.io-netty ここに、私たちのために機能したHAProxyファイルがあります。 XHRポーリングにフォールバックせずにWebsocketを使用するためのトリックは、HAProxyをTCPモードに設定します。HAProxyconfig:

global
    daemon
    maxconn 32000

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

listen http-in
    bind *:80
    server server1 1.1.1.1:8000 check
    server server2 1.1.1.1:8000 check

listen socketio-in
    mode tcp
    bind *:8080
    balance source
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    server server1 1.1.1.1:8080 check
    server server2  1.1.1.1:8080 check

1.1.1.1はIPです

4
Ilya