WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

Posted

技术标签:

【中文标题】WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET【英文标题】:WebSocket connection to 'ws://.../socket.io/' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET 【发布时间】:2017-02-12 03:23:58 【问题描述】:

我正在使用 nginx 并代理到我的应用程序,该应用程序使用 node.js 上的 socket.io 进行 websocket 连接。

通过域访问应用时出现上述错误。

我已经根据https://github.com/socketio/socket.io/issues/1942配置了nginx,以确保websockets被正确代理到node.js后端。

我的nginx配置如下:

server 
    listen 80;
    server_name domain.com;

    location / 
        proxy_pass http://xxx.xx.xx.xx:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    

在我的 react 客户端中,我以这种方式启动 websocket 连接:

import io from 'socket.io-client';

componentWillMount() 
    this.socket = io();
    this.socket.on('data', (data) => 
        this.state.output.push(data);
        this.setState(this.state);
    );

感谢任何建议!

编辑 1:

经过更多调查。

我的服务器设置如下:

可从互联网访问的域:web-facing.domain.com 可从内网访问的域:internal.domain.com

当我从内网访问应用程序时,它可以正常工作,但从互联网访问时出现错误。

我怀疑这是由于使用this.socket = io() 创建了套接字,它与当前域建立了套接字连接。

由于节点中的套接字正在侦听ws://internal.domain.com,当通过web-facing.domain.com 连接时,会创建错误的套接字ws://web-facing.domain.com

那么现在的问题是,如何在从不同域访问时创建到内部域的套接字?

编辑 2:

我已添加app.set('trust proxy', true) 来配置 Express 以接受代理连接,但仍然无法正常工作。

【问题讨论】:

您确定您的 Node 服务器正确处理连接(并且没有抛出任何错误)吗?当你把 Nginx 排除在外时,你有没有试过看看它是否有效? @robertklep 当我在 localhost 上使用一个端口和另一个端口上的客户端进行测试时,它可以工作。 您是否也尝试过不使用 nginx 而是使用浏览器作为客户端? nginx 配置对我来说看起来不错,我正在使用非常相似的东西。 @robertklep 是的,测试是在图中没有nginx的情况下完成的。 我已经更新了我的帖子以提供更多信息。 【参考方案1】:

原来在我的服务器前面还有另一个我无法控制的反向代理。 将我的服务器设置更改为直接面向 Internet 并按预期工作。

【讨论】:

以上是关于WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET的主要内容,如果未能解决你的问题,请参考以下文章

内容安全策略拒绝连接到 Websocket 错误

actioncable 无法连接到 websocket

WebSocket 连接到自签名服务器

WCF 连接到 Websocket 服务器

在android java中连接到服务器websocket

WebSocket 连接到 'ws://localhost:4444/subscriptions' 失败:WebSocket 在连接建立之前关闭