WebSocket 経由の接続が 60 秒後に閉じるのはなぜですか?

仮想プライベートクラウド クラシック・インフラストラクチャー

Ingress サービスによって、WebSocket を使用するアプリが公開されます。 ただし、クライアントと WebSocket アプリとの間の接続は、60 秒間送信されるトラフィックがない場合は閉じられます。

以下のいずれかの理由により、WebSocket アプリへの接続が非アクティブで 60 秒間経過した後に除去されることがあります。

  • インターネット接続に、長時間の接続を許容しないプロキシーまたはファイアウォールがある。
  • WebSocket アプリに対する ALB でのタイムアウトによって、接続が終了する。

非アクティブで 60 秒間経過した後も接続が閉じられないようにするには、以下のようにします。

  1. プロキシーまたはファイアウォールを介して WebSocket アプリに接続する場合は、プロキシーまたはファイアウォールが長時間の接続を自動的に終了するように構成されていないことを確認します。

  2. 接続を活動状態で保つには、タイムアウトの値を増やすか、またはアプリでハートビートをセットアップします。

    • タイムアウトの変更: ALB 構成の proxy-read-timeout の値を大きくします。 例えば、60s から 300s などのより大きい値にタイムアウトを変更するには、アノテーションnginx.ingress.kubernetes.io/proxy-read-timeout: 300を Ingress リソース・ファイルに追加します。 クラスター内のすべてのパブリック ALB のタイムアウトが変更されます。
    • ハートビートのセットアップ: ALB のデフォルトの読み取りタイムアウト値を変更しない場合は、WebSocket アプリでハートビートをセットアップします。 WAMPのようなフレームワークを使ってハートビートプロトコルを設定すると、アプリのアップストリームサーバーは定期的に ping メッセージを送信し、クライアントは pong メッセージで応答する。 ハートビート間隔を58秒以下に設定し、 ping/pong トラフィックが、60秒のタイムアウトが実施される前に接続を開き続けるようにする。