WebSocket 経由の接続が 60 秒後に閉じるのはなぜですか?
仮想プライベート・クラウド クラシック・インフラストラクチャー
Ingress サービスによって、WebSocket を使用するアプリが公開されます。 ただし、クライアントと WebSocket アプリとの間の接続は、60 秒間送信されるトラフィックがない場合は閉じられます。
以下のいずれかの理由により、WebSocket アプリへの接続が非アクティブで 60 秒間経過した後に除去されることがあります。
- インターネット接続に、長時間の接続を許容しないプロキシーまたはファイアウォールがある。
- WebSocket アプリに対する ALB でのタイムアウトによって、接続が終了する。
非アクティブで 60 秒間経過した後も接続が閉じられないようにするには、以下のようにします。
-
プロキシーまたはファイアウォールを介して WebSocket アプリに接続する場合は、プロキシーまたはファイアウォールが長時間の接続を自動的に終了するように構成されていないことを確認します。
-
接続を活動状態で保つには、タイムアウトの値を増やすか、またはアプリでハートビートをセットアップします。
- タイムアウトの変更: ALB 構成の
proxy-read-timeout
の値を大きくします。 例えば、60s
から300s
などのより大きい値にタイムアウトを変更するには、 の アノテーションnginx.ingress.kubernetes.io/proxy-read-timeout: 300
を Ingress リソース・ファイルに追加します。 クラスター内のすべてのパブリック ALB のタイムアウトが変更されます。 - ハートビートのセットアップ: ALB のデフォルトの読み取りタイムアウト値を変更しない場合は、WebSocket アプリでハートビートをセットアップします。 WAMPなどのフレームワークを使用してハートビート・プロトコルをセットアップすると、アプリケーションのアップストリーム・サーバーは定期的に
ping
メッセージを送信し、クライアントはpong
メッセージで応答します。 ハートビート間隔を 58 秒以下に設定して、60 秒のタイムアウトが適用される前にping/pong
トラフィックが接続を開いたままになるようにします。
- タイムアウトの変更: ALB 構成の