连接到 Websocket 代理时 Google Chrome 出错

Error on Google Chrome when connecting to Websocket proxy

我有一个简单的后端 Kotlin 应用程序,它 运行 是 Google 云虚拟机上的 Netty 服务器。它接收 websocket 连接并向客户端发送一些简单的消息。我在同一台机器上也有 nginx 服务器 运行ning,它侦听 443 端口并将请求重定向到我的应用程序 (127.0.0.1:8080)。这是 nginx 配置:

server {

    listen 443 ssl;
    server_name www.mydomain.com;

    ssl_certificate /etc/nginx/certs/my-cert.crt;
    ssl_certificate_key /etc/nginx/certs/my-key.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_read_timeout 86400;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;

    }

}

配置中的 ssl 证书有效并由真正的 CA 认证。

现在我正在尝试编写一个连接到我的代理的简单前端 Angular 应用程序:

return webSocket({
      url: `wss://www.mydomain.com/${path}`,
      closeObserver: {
        next: (event: CloseEvent) => { console.log(event) }
      }
    }).multiplex(() => {}, () => {}, () => true)

我正在订阅此方法返回的 Observable 并打印传入消息。

除Google Chrome 外,所有这些在每个浏览器中都可以正常工作。 (我试过 Firefox、Opera、Chromium、Edge)。此外,一切都适用于 chrome 扩展 Smart Websocket Client。它甚至在 Chrome 的隐身模式下工作正常,但在 ragular 模式下失败。

在 chrome 我得到

WebSocket connection to 'wss://mydomain.com/something' failed.

我记录的 CloseEvent 不是很有用,它只是说代码是 1006,字段 原因 是空的。

当我绕过代理并使用 ws://www.mydomain.com:8080/something 直接连接到我的应用程序时,它在 chrome.

上运行良好

我想我的 nginx 配置出了点问题,我说不清是什么。所有为 websockets 配置 nginx 的指南都说应该这样配置。

我花了 2 天时间搜索有关此问题的信息,但没有找到任何真正的答案来解释为什么会发生这种情况以及我该如何解决它。

有人知道为什么会这样吗?

更新 这是另一件有趣的事情。我写了一个连接到我的代理的简单脚本,就像我的 Angular 应用程序一样,但使用标准 api.

let ws = new WebSocket("wss://mydomain.com/something");
ws.onmessage = (ev) => {
    console.log(ev.data);
    document.getElementById("result").innerHTML += ev.data
};
ws.onerror = (err) => {
    console.log(err)
}

当我使用 file:// 在 chrome 中打开这个文件时,一切正常。它连接到我的 ws 服务器并在屏幕上打印收到的消息。但是当我 运行 本地 Apache 服务器并在 localhost:80 上提供相同的文件时,我得到与之前在 Chrome 中相同的错误。 (当通过本地主机访问文件时,其他浏览器和隐身模式仍然可以正常工作) 所以这个问题和Angular.

没有太大关系

您提到在 private/incognito 模式下它可以工作,您是否尝试过禁用所有扩展并连接到 websocket?