websocket - 由于缺少 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 的情况下也能正常工作。
解决方案
在浏览器中使用 WebSocket 对象时遇到完全相同的问题后,我深入挖掘并在我们正在使用的 Google Load Balancer 服务的文档中找到了这一点:
WebSocket 连接的超时时间取决于负载均衡器的可配置后端服务超时时间,默认为30 秒。此超时适用于 WebSocket 连接,无论它们是否正在使用中。有关后端服务超时以及如何配置它的更多信息,请参阅超时和重试。
查看本文以获取有关如何配置负载均衡器以正确处理 WebSocket 的更多信息:
推荐阅读
- pdf - 在 Pandoc 中将 docx 转换为 pdf 时如何保持样式?
- c# - 能否达到这种双精度舍入误差条件?
- razor - 如何将我的 html 中的对象注入到 jsRender 模板中
- c# - 选择提示后如何到达下一个瀑布?
- asp.net-mvc - Kendo Grid 层次结构 - 将行 ID 传递给嵌套网格
- python - OBD2 马自达 3 车门代码
- f# - 在 Visual Studio 代码中安装 F#
- oracle - Symfony 2.8 - Oracle:ManyToMany 返回列 id 必须映射到类中的字段
- .htaccess - .htaccess:将一些子页面重定向到新的子页面,所有其他的重定向到新的主页面
- ansible - 用于检查服务的 ansible 命令