为什么通过 WebSocket 的连接会在 60 秒后关闭?

虚拟私有云 传统基础设施

Ingress 服务公开使用 WebSocket 的应用程序。 但是,客户机与 WebSocket 应用程序之间的连接会在它们之间不发送流量 60 秒后关闭。

由于以下某个原因停止活动 60 秒后,与 WebSocket 应用程序的连接可能断开:

  • 因特网连接具有一个代理或防火墙,不容许长时间连接。
  • ALB 到 WebSocket 应用程序的超时终止连接。

为避免连接在停止活动 60 秒后关闭:

  1. 如果通过代理或防火墙连接到 WebSocket 应用程序,确保未将代理或防火墙配置为自动终止长时间连接。

  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 秒超时强制执行前保持连接打开。