4

私は、websocket ハンドラーを使用する Tornado アプリに取り組んでいます。Supervisord を使用してアプリの複数のインスタンスを実行していますが、websocket 接続の負荷分散に問題があります。

nginx がすぐに使用できる Websocket の処理を​​サポートしていないことはわかっていますが、こちらの指示に従いましたhttp://www.letseehere.com/reverse-proxy-web-socketsで、nginx tcp_proxy モジュールを使用してプロキシ Websocket 接続をリバースします。ただし、モジュールは websocket の URL をルーティングできないため (例: ws://localhost:80/something)、これは機能しませんでした。そのため、Tornado アプリで定義した URL ルートでは機能しません。

Web に関する私の調査から、HAProxy は WebSocket 接続の負荷を分散する方法のようです。ただし、Websocket 接続の負荷を分散し、Websocket URL ルートを処理できるように HAProxy をセットアップするための適切なガイダンスを見つけるのに苦労しています。

これを実現する方法についての詳細な指示をいただければ幸いです。また、他のソリューションにも完全にオープンです。

4

4 に答える 4

5

WebSocketをhaproxyに実装することは難しくありませんが、これに関するドキュメントを見つけるのはまだ簡単ではないことを認めます(この応答が1つの例になることを願っています)。haproxy 1.4を使用している場合(私はあなたがそうだと思います)、HTTPアップグレードはhaproxyによって認識されるため、何もしなくても他のHTTPリクエストと同じように機能します。

WebSocketトラフィックを残りのHTTPとは異なるファームに転送する場合は、コンテンツ切り替えルールを使用する必要があります。

フロントエンドpub-srv
    バインド:80
    use_backend websocket if {hdr(Upgrade)-i WebSocket}
    default_backend http

 バックエンドWebSocket
    タイムアウトサーバー600秒
    サーバーノード11.1.1.1:8080チェック
    サーバーノード22.2.2.2:8080チェック

 バックエンドhttp
    タイムアウトサーバー30秒
    サーバーwww11.1.1.1:80チェック
    サーバーwww22.2.2.2:80チェック

1.5-devを使用している場合は、「タイムアウトトンネル」を指定して、WS接続のタイムアウトを通常のHTTP接続よりも大きくすることもできます。これにより、クライアント側で過度に長いタイムアウトを使用する必要がなくなります。

アップグレード:WebSocket +特定のURLを組み合わせることもできます:

フロントエンドpub-srv
    バインド:80
    acl is_websocket hdr(Upgrade)-i WebSocket
    aclis_ws_urlパス/something1/ something2 / something3
    is_websocketis_ws_urlの場合はuse_backendwebsocket
    default_backend http

最後に、私たちが時々目にする愚かな24時間のアイドルタイムアウトを使用しないでください。現在、確立されたセッションでクライアントを24時間待つことはまったく意味がありません。ウェブは80年代よりもはるかにモバイルであり、接続は非常に短命です。結局、多くのFIN_WAITソケットが無料になります。現在のインターネットでは、すでに10分はかなり長いです。

これがお役に立てば幸いです。

于 2012-06-05T21:49:11.820 に答える
0

WebSockets は、ハンドシェイク後に通常の HTTP 動作に従っていないため、プロキシをうまくトラバースしません。

WebSocket (wss://) プロトコル (セキュア WS) を使用してみてください。これは、WebSocket プロトコルを隠す Proxy CONNECT API を使用します。

于 2012-06-05T14:30:45.163 に答える
0

http nginx (nginx v1.3 以降のみ)

upstream chatservice {
    #multi thread by tornado
    server 127.0.0.1:6661;
    server 127.0.0.1:6662;
    server 127.0.0.1:6663;
    server 127.0.0.1:6664;
}
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

仮想ホスト

server {
    listen 80;
    server_name chat.domain.com;
    root /home/duchat/www;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ @backend;
    }
    location @backend {
            proxy_pass_header Server;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://chatservice;
            internal;
}
于 2014-12-07T10:21:18.850 に答える