当我在 Open*** 后面时,浏览器在建立 WebSocket 连接一秒后关闭并显示错误 1006
Posted
技术标签:
【中文标题】当我在 Open*** 后面时,浏览器在建立 WebSocket 连接一秒后关闭并显示错误 1006【英文标题】:Browser closes WebSocket connection with error 1006 one second after it is established when I'm behind Open*** 【发布时间】:2020-08-17 19:42:42 【问题描述】:我在 Amazon VPS 上托管了小型 HTTP + WebSocket 服务器。 Index.html 有 JS 代码来连接 WebSocket 服务器并与之交换数据。当我使用公共 IP 或域名直接连接我的服务器时 - 一切正常。
但是我不希望这台服务器公开,所以我将 Open*** 配置为私下连接到这台服务器。
有时在 Open*** 上一切正常,当我在浏览器(Chrome 或 Opera)中输入本地(*** 内部)服务器 IP 地址时,它会成功加载 index.html,连接我的 WebSocket 服务器并通过 WebSocket 连接成功交换数据。 但有时(或某些天)在 Websocket 连接建立后 1 秒,它会被浏览器关闭,错误代码为 1006,并且没有任何描述。我的脚本在此之后 1 秒尝试重新连接 WebSocket,但结果始终相同。
我不明白为什么有时一切正常,而有时我几个小时都无法通过 Open*** 使用 WebSocket。
谁能描述一下为什么在 Open*** 上使用 WebSocket 时会出现错误 1006,以及如何通过编码或重新配置 Chrome、Opera 或 Open*** 来消除它?
【问题讨论】:
如果套接字在第一秒内关闭,我可以认为是连接建立的问题。升级请求期间可能出现问题。这是第一个 http 请求,发生在将协议切换到 WebSocket 之前。如果此请求序列失败,浏览器可能会返回 1006 错误。您可能应该在 chrome 开发人员工具中检查第一个请求。 感谢@SleepWalker,但这不是我的情况,因为当客户端直接连接服务器时一切正常。仅当服务器位于 *** 之后时才会出现此问题。我发现减少 WebSocket 消息大小可以解决问题。 【参考方案1】:我发现只有当 WS 连接的任何一侧发送大消息时才会出现问题。
我猜如果浏览器和WebSocket服务器之间有一些中间件,比如***、防火墙或代理,那么大的WS消息可能会超过该中间件的一些内部数据包大小或限制,它会在消息期间中断浏览器和服务器之间的连接转移。这种意外断开会导致您的浏览器出现错误 1006。
如果您的客户端遇到错误 1006 的意外断开连接,请尝试最小化您的 API 的 WebSocket 消息大小。如果您需要发送大量数据,请不要将其一大块发送。你最好把它切片,然后发送多条短信。
【讨论】:
以上是关于当我在 Open*** 后面时,浏览器在建立 WebSocket 连接一秒后关闭并显示错误 1006的主要内容,如果未能解决你的问题,请参考以下文章
如何使用反向代理修复 Keycloak 中的“我们很抱歉需要 HTTPS”?
如果我在 *** 后面,有没有办法追踪数据包的“真实”路由?