与'ws://.../socket.io/'的WebSocket连接失败:WebSocket握手期间出错:net :: ERR_CONNECTION_RESET

时间:2016-10-04 04:32:16

标签: node.js reactjs nginx socket.io

我正在使用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
可从Intranet访问的域: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配置为接受代理连接,但它仍无效。

1 个答案:

答案 0 :(得分:3)

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