私は最近(ロードバランサーのないVPCで)EC2インスタンスをセットアップしましたが、確かに構成は少し奇妙ですが、実行しているWebアプリケーションに必要なものです。
Webサーバー(Haskell内)はポート4433で実行され(標準ポートはApacheインスタンス用に予約されています)、別のシステムからブロードキャストされるUDPパケットを受信しています。ここに示されているように(テスト中に)多くのポートが(セキュリティグループから)広く開いています:
Custom TCP Rule 4433 tcp 0.0.0.0/0 ✔
Custom TCP Rule 8080 tcp 0.0.0.0/0 ✔
SSH 22 tcp 0.0.0.0/0 ✔
HTTP 80 tcp 0.0.0.0/0 ✔
HTTPS 443 tcp 0.0.0.0/0 ✔
Custom UDP Rule 30090 udp 0.0.0.0/0 ✔
Custom UDP Rule 30089 udp 0.0.0.0/0 ✔
TCPソケットのJavaScriptは、AWSのパブリックIPに割り当てられたURLを使用して、この同じポートでソケットをセットアップするリクエストを行います。リクエストがエラーを返します。
「wss:// [URL]:4433/projects/socket」へのWebSocket接続に失敗しました:WebSocketのハンドシェイクをキャンセルしました。
ソケットを0.0.0.0にバインドすると、同じエラーが発生します。
Haskellウェブサーバーを起動するには、AWSが提供する内部 IPを参照する必要がありました。これは、エラスティックIPサービスが提供するpublic IPを参照すると実行されないためです。これが問題が発生した場所だと思って、ソケット要求をこれに変更しました...
wss://[internal ip]:4433/projects/socket
これによりエラーが変わります。
「wss:// [内部IP]:4433/projects/socket」へのWebSocket接続に失敗しました:接続の確立エラー:net :: ERR_CONNECTION_REFUSED
内部IPは外部の世界では利用できないため、このエラーは理にかなっています。
AWSのwebsocketで読んだものにはすべてELB(Elastic Load Balancer)が関係しており、それらのいずれかは必要ありません。 SOは利用できません。また、Amazonでサポートケースをセットアップします(質問の一部は答えさえもらえていません)で、現在投稿されているすべての回答のすべてを試しました。ほぼ24時間前に)応答がありません。
http://[URL]:4433/projects/socket
に移動すると、「WebSocket Available」が生成されます。ここで、URLは使用したいものであり、AWSが提供するパブリックDNSです。
netstat -plunt
を実行すると、次のことがわかります。
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:8080 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:4433 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
udp 0 0 [internal IP]:30089 0.0.0.0:* -
udp 0 0 0.0.0.0:30090 0.0.0.0:* -
udp 0 0 0.0.0.0:11950 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp6 0 0 :::38450 :::* -
AWSのwebsocketで同様の問題を抱えている人はいますか?もしそうなら、どのように問題を解決しましたか?
HaskellサーバーとApacheサーバーの間にSSL証明書の不一致がありました。
Haskellサーバーは、インスタンスの新しい証明書に関する情報を使用して再構築する必要がありました。さらに適切なSSLライブラリ(libssl0.9.8 libssl-dev
)EC2インスタンスにインストールされていなかったため、Haskellサーバーの再構築中に問題が発生していました。 EC2インスタンスが「空白のキャンバス」であることを知っていると、そのインストールがないことが私のせいになります。
libssl
をインストールしたら、新しい証明書を指すHaskellサーバーを再構築できました。証明書が「一致」すると、websocketの問題はなくなりました。
繰り返しになりますが、私たちの状況は独特です。 Apacheサーバー(ポート80と443)とHaskellサーバー(ポート8080と4433)があり、これらは互いに通信して、websocketでpub-sub操作を実行します。 2台のサーバー間の証明書の不一致(どのタイプでもかまいませんが、複数のApacheインスタンスである可能性があります)がSSL警告を引き起こしました。 SSLからの警告は、websocketを確立または維持しようとする試みを破棄します(したがって、ハンドシェイクがキャンセルされたというメッセージです)。
別のStackOverflowポスト は、このプロセス中に非常に役立ついくつかの手がかりを提供しました。より具体的には、この警告-
問題の鍵はこれです:SSL証明書がなんらかの警告を引き起こす場合、wss:// WebSocket接続はすぐに失敗します、そしてこれを検出する標準的な方法はありません。