0

リアルタイム通信を管理するために、Sockjs を使用してPrimus.ioを実行している node.js サーバーのクラスターにリクエストをルーティングするように、エラスティック ロード バランサーをセットアップしようとしています。

次の構成でリッスンするようにロードバランサーをセットアップしました。

  • HTTPS 8084 -> HTTPS 8084 (node.js サーバーで使用されるポート)
  • SSL 443 -> TCP 80

私の理解では、websocket を ELB 経由で機能させる唯一の方法は SSL->TCP を介することであり、したがって上記の構成です。

ここで説明されているように、ELB の新しいプロキシ プロトコルを正しく有効にしました。

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

クライアントからサーバーに接続しようとすると、最初に HTTPS 要求が送信され、収集できるものから Websockets にアップグレードする必要があります。しかし、ロードバランサーのアドレスに送信すると、リクエストは単に失敗します。

最初の Primus 接続要求を単一の nodejs サーバーの IP に送信すると、次のようになります。

var primus = new Primus('https://ip.address.of.single.server:8084');

リクエストは正しく返され、websockets に正しくアップグレードされます。

IP アドレスをバランサーの IP アドレスに切り替えると失敗し、node.js サーバーへの最初の https 要求は何も返しません。これは、websocket 転送を確立できなかったことを意味すると思いますが、正直なところ、この分野での経験はほとんどないため、完全に間違っている可能性があります。

誰かが私が間違っていることを知っていますか?

前もって感謝します

4

1 に答える 1

1

NodeJS インスタンスをクラスター化しましたか? たとえば、SocketIO を使用する場合は、クラスター化されたセッション ストアを使用する必要があります。実際、Vertx 上で動作する SockJS についても現在調査中です。

背後にある問題は、Amazon ELB が過去の転送を尊重しないことです (HTTP 上のスティッキー セッションとは対照的に)。これは、TCP レベルを介した接続を任意のクラスターのノードで転送できることを意味します。はい、1 つの TCP チャネルで問題ありません。ただし、SocketIO のようなフレームワークは、セッション (WebSocket には存在しません) と複数のトランスポート層 (http、ポーリング、ソケットなど) をサポートするために、もう少し多くのことを行います。

于 2013-11-20T20:25:29.407 に答える