為何透過 WebSocket 的連線會在 60 秒之後關閉?

虛擬私有雲 經典基礎架構

您的 Ingress 服務會公開一個使用 WebSocket 的應用程式。 不過,當用戶端與 WebSocket 應用程式之間有 60 秒未傳送任何資料流量時,就會關閉其間的連線。

在閒置 60 秒之後,可能會因下列其中一個原因而捨棄與 WebSocket 應用程式的連線:

  • 您的網際網路連線具有不容忍長期連線的 Proxy 或防火牆。
  • ALB 到 WebSocket 應用程式的逾時會終止連線。

若要防止在閒置 60 秒後關閉連線,請執行下列動作:

  1. 如果您透過 Proxy 或防火牆連接至 WebSocket 應用程式,請確定未將 Proxy 或防火牆配置為自動終止長期連線。

  2. 若要保持連線處於作用中狀態,您可以增加逾時值,或在應用程式中設定活動訊號。

    • 變更逾時時間:增加 ALB 設定中 proxy-read-timeout 的值。 例如,若要將超時時間從 60s 改為較大的值,如 300s,請在您的 Ingress 資源檔案中加入此 註解nginx.ingress.kubernetes.io/proxy-read-timeout: 300。 已變更叢集裡所有公用 ALB 的逾時。
    • 設定心跳:如果您不想變更 ALB 的預設讀取逾時值,請在 WebSocket 應用程式中設定心跳。 當您使用 WAMP 之類的框架設定心跳通訊協定時,應用程式的上游伺服器會以定時的間隔定期傳送 ping 訊息,而用戶端也會回應 pong 訊息。 將心跳間隔設定為 58 秒或更短,以便 ping/pong 流量在 60 秒逾時強制執行之前保持連線開啟。