socket.io 握手在 Google https 负载均衡器上失败

socket.io 握手在 Google https 负载均衡器上失败

我们对 Google HTTPS 负载均衡器进行了以下设置。

两个前端:1. HTTP 流量到静态 IP 2. HTTPS 流量到同一个静态 IP(DNS 配置为域名)

主机和路径规则全部转到后端

一个后端:使用 HTTP 协议,并将会话亲和性设置为客户端 IP

后端实例在端口 3000 上运行一个 MEAN 应用程序。

从我们的客户端应用程序,我们能够使用负载均衡器域名访问后端应用程序。但我们也有一个使用 socket.io 的聊天功能

对于套接字连接,我们无法使用负载均衡器域名。它会抛出 400 错误。

如果我们尝试直接使用后端 IP 进行套接字连接,它可以工作,但如果客户端使用 HTTPS,则会产生另一个问题,因为后端是 http。

Google 文档称,loadbalancer 默认支持 websockets。所以不确定发生了什么。我看到的所有其他示例都比较旧,我认为不相关。任何帮助都非常感谢。谢谢。

答案1

对于 HTTP(S) 负载均衡器上的 WebSocket,后端服务(响应)超时是连接生命周期限制(在配置的响应超时后,WebSocket 连接将被终止)。因此,超时应设置为 WebSocket 连接保持打开状态的最大时间。适当的响应超时值取决于您使用的应用程序。

您需要做一些实验来找到合适的响应超时以避免连接超时关闭(稍微增加其值并重试;例如,如果 30 秒不够,请尝试 40 秒、50 秒等)。

发现于堆栈溢出

答案2

嗨,我已经努力调试这个问题两个星期了。

@jfriend00 的评论为我这个平民百姓的思想提供了启示。

在 nodejs 部署端点上,我必须按以下顺序传递传输:

  app = express()
  server = require('http').Server(app)# {key: tlskey, cert: tlscert},app)
  io = require('socket.io')(server, { transports: ['websocket', 'polling'], cookie:true, secure: true })
  app.use bodyParser.urlencoded(extended: true)

发生了什么?我指定 socket.io 明确使用 websocket 传输。如果失败,请回退到轮询。由于 HTTPS GCE Ingress 设置了一些标头(将一些标头升级到 wss),我需要该secure:true标志才能在我的后端匹配它们。如果没有上述内容,error 400客户端就会发生这种情况。

该服务以 的形式运行NodePort,并带有Generate_Cookie

如果仍然失败,请尝试transports: ['polling'],这是最基本的协议。

以下是socket.io 文档

相关内容