我正在使用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 接受代理连接,但仍然无法解决问题。