WebSocket连接到'ws://.../socket.io/'失败:WebSocket握手期间发生错误:net :: ERR_CONNECTION_RESET

4
我正在使用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()创建 socket 引起的,该函数将在当前域上设置 socket 连接。

由于 node 中的 socket 在监听 ws://internal.domain.com,因此通过 web-facing.domain.com 连接时,将创建错误的 socket:ws://web-facing.domain.com

所以现在的问题是,当从不同的域访问时,如何创建一个到内部域的 socket?

编辑2:

我已经添加了 app.set('trust proxy', true) 来配置 Express 接受代理连接,但仍然无法解决问题。


你确定你的Node服务器正在正确处理连接(而不会抛出任何错误)吗?你尝试过在没有Nginx的情况下运行它,看看是否正常工作了吗? - robertklep
@robertklep 当我在本地主机上使用一个端口测试节点,并在另一个端口上使用客户端时,它可以正常工作。 - Jiraffe
你是否尝试过不使用nginx,而是使用浏览器作为客户端?nginx配置看起来没问题,我正在使用类似的东西。 - robertklep
@robertklep 是的,在测试时没有涉及到nginx。 - Jiraffe
我已经更新了我的帖子并添加了更多信息。 - Jiraffe
显示剩余3条评论
1个回答

3
原来我的服务器前面有另一个反向代理,我无法控制。现在我将服务器设置直接面向互联网,它按预期工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接