質問: AWSのELB配下のEC2にapacheとnode.jsを構築しています。 apacheが既存システムとして動いており、ブラウザとのリアルタイム通信機能するにあたり、node.js及びWebSocketが追加されたような状態です。 ブラウザからサーバに対して、WebSocketで通信を開始しようとすると、 failed: Error during WebSocket handshake: Unexpected response code: 200 エラーが出てしまいます。 ちなみにELB側にSSL証明書を紐付けているため、ブラウザからはhttps通信なのですが、ELB→EC2はhttp通信です。 よってブラウザからWebSocket通信するURLは"wss://hoge:9001"となり、 ブラウザに直接、https://hoge:9001と打ち込むとhello worldは返すことはできたのですが、javascirptからnew WebSocket('wss://hoge:9001')とすると、上記のエラーが出てしまいます。 なお、ELBを利用しているのは、AWSのCertificate ManagerによってSSL証明書の無料利用かつ、更新不要にしたいからであり、EC2インスタンスは1つだけです。 解決策、妙案あれば宜しくお願いします。
回答: WebSocketを利用する場合、ELBのリスナーでロードバランサのプロトコルはHTTPSではなくセキュアTCPを使いましょう。 ロードバランサのプロトコル:SSL (セキュアTCP) ロードバランサのポート:9001 インスタンスのプロトコル:TCP インスタンスのポート:インスタンス側のポート番号 インスタンス側のプロトコルでHTTPは試したことはありません。 TCPで問題なく動いています。 以下追記 また、アイドルタイムアウトも標準の60から3600等、長くすることをオススメします。 (アプリの作り次第とは思いますが)