44

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

Webとメーリングリストをトロールしましたが、提案された解決策を機能させることができません。

(psこれはserverfaultの可能性がありますが、SOには他のHAProxyの質問があるため、ここに投稿することを選択しました)

4

4 に答える 4

60

最新バージョンの socket.io (0.6.8 -> npm install socket.io@0.6.8、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
于 2011-01-19T16:12:15.900 に答える
6

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

関連する HAProxy の議論: http://www.mail-archive.com/haproxy@formilux.org/msg03046.html

議論から、TCP モードをデフォルトにして、非 WebSocket 接続用に HTTP にフォールバックする方法があるように思えます。

于 2010-12-05T18:32:26.467 に答える
5

私たちは Netty 実装https://github.com/ibdknox/socket.io-nettyを使用しています。これが私たちのために機能した HAProxy ファイルです。XHR-Polling にフォールバックせずに Websockets を使用するための秘訣は、HAProxy を TCP モードにすることです。HAProxy 構成:

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 です

于 2011-06-15T04:52:06.753 に答える
-1

node-websockets-server の代わりに Socket.io を使用してみてください。これは、ブラウザとサーバー間のさまざまなインスタント通信方法へのフォールバックを備えた抽象化レイヤーです。

WebSocket が HTTP 1.0 に違反しているのは事実ですが、HTTP 1.1 には違反していないため、HTTP 1.1 をプロキシできる任意のサーバーでプロキシできるはずです。

于 2010-12-14T17:26:57.900 に答える