我正在使用nginx并代理到我的应用程序,该应用程序在node.js上使用socket.io进行websocket连接.
通过域访问应用程序时出现上述错误.
我已根据https://github.com/socketio/socket.io/issues/1942配置了nginx以确保将websocket正确代理到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-face.domain.com
可从Intranet访问的域:internal.domain.com
当我从Intranet访问该应用程序时,它可以正常工作,但从Internet访问时出现错误.
我怀疑这是由于使用this.socket = io()创建了套接字,该套接字与当前域建立了套接字连接.
由于节点中的套接字正在监听ws://internal.domain.com,因此当通过web-face.domain.com连接时,会创建错误的套接字ws://web-face.domain.com.
所以现在的问题是,当从其他域访问时,如何创建内部域的套接字?
编辑2:
我添加了app.set(‘trust proxy’,true)来配置Express接受代理连接,但是它仍然无法正常工作.
解决方法:
事实证明,我无法控制服务器前面还有另一个反向代理.
将我的服务器设置更改为直接面向互联网,并且可以正常工作.