首页 > 解决方案 > 由于缺少 Keep-Alive 标头,Socket.io 在 HTTP 2 上永久断开连接

问题描述

在使用 HTTP 1.1 在不安全的上下文中开发我的应用程序之后,我现在使用 HTTPS 将它部署到 HTTP 2 服务器。一切都很好,花花公子。30秒... :)

之后,套接字断开连接并再次连接。然后再次。然后再次。

在此处输入图像描述

我从服务器响应中看到缺少的是我在 HTTP 1.1 服务器上获得的Connection: keep-alive和标头。Keep-Alive: timeout=5代码是完全一样的,而且通信工作得很好。

我想 socket.io 有一些通过 HTTP 2 工作的聪明方法,但我在文档中找不到任何关于此的内容。

有趣的是,客户端确实请求了 keep-alive 标头,尽管它在 HTTP 2 上运行。但是,遗憾的是,没有返回任何内容并且套接字断开连接:(

在此处输入图像描述

我注意到有人尝试通过 Express 使用 SPDY:

让 socket.io、express 和 node-http2 通过 HTTP/2 进行通信

我认为这是一个可能的解决方案,但我希望它在没有 SPDY 的情况下也能正常工作。

标签: websocketsocket.io

解决方案


在浏览器中使用 WebSocket 对象时遇到完全相同的问题后,我深入挖掘并在我们正在使用的 Google Load Balancer 服务的文档中找到了这一点:

WebSocket 连接的超时时间取决于负载均衡器的可配置后端服务超时时间,默认为30 秒。此超时适用于 WebSocket 连接,无论它们是否正在使用中。有关后端服务超时以及如何配置它的更多信息,请参阅超时和重试。

https://cloud.google.com/load-balancing/docs/https?fbclid=IwAR2Qugtlyvd05VteGWk2RCevebUJrHTHyW9RHAwYiPxudM6qOovaa2Zdqpk

查看本文以获取有关如何配置负载均衡器以正确处理 WebSocket 的更多信息:

https://medium.com/johnjjung/how-to-use-gcp-loadbalancer-with-websockets-on-kubernetes-using-services-ingresses-and-backend-16a5565e4702


推荐阅读