编辑:我继续搜索,并进一步了解。现在,当调用我的端点时,我收到以下错误:
GET /?EIO=3&transport=polling&t=LhnJ9p5 404
所以现在它最终会在正确的位置结束,但它会执行轮询请求而不是ws连接。仍然,调用后端直接工作正常,但通过Nginx搞砸了我的请求。
客户端
import io from 'socket.io-client';
...
//Does work
io.connect('localhost:10007');
// Does not work
io.connect('http://localhost', {path:'/my/path'});
socket.on('connect', function(){console.log('Connected!');});
socket.on('event', function(data){console.log('Data: ', data);});
socket.on('disconnect', function(){console.log('Disconnected!');});
服务器
// Lots of initiation, middleware, routing etc.
let app = express.init('src/');
let server = http.createServer( app );
var io = require( "socket.io" )( server );
server.listen(10007,'127.0.0.1');
io.on('connection', function(socket){
console.log("User Connected");
});
nginx.conf
location /my/path/ {
proxy_pass http://127.0.0.1:10007/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
浏览互联网,我偶然发现了类似的问题,所有这些似乎只是指向nginx.conf中的配置。虽然它似乎对其他人有效,但我错过了其他的东西。
我在Nginx代理后面设置了一个后端。后端基于express,其工作方式类似于处理对GET / POST / DELETE等的不同调用的API .Nginx设置代理以将调用转发到后端服务器,一切都很顺利。
现在我需要实现到后端的websocket连接,我似乎没有做对。电话永远不会通过后端,我不知道为什么。这是我的服务器代码:
function setRoutes(app) {
...
/**
* Set up socket.io to the endpoint
*/
let server = require('http').Server(app);
let io = require('socket.io')(server);
io.on('connection', (socket) => {
console.log('Client is connected: ', socket);
});
// If I uncomment this, I am able to connect to localhost:80 on the client
//server.listen(80);
}
如上面的评论中所述,如果我忽略服务器后端设置,并通过直接侦听localhost上的端口80来绕过它,则websocket连接可以正常工作。但是所有其他端点都从Nginx中的代理地址中删除。我希望websocket连接到服务器其余部分使用的相同端点地址。
稍微阅读一下,我注意到这个here上有一个走路槽,但这似乎设置了websocket的整个端点,而我想在我的快速代码中定义我的路由,而不是我的Nginx设置。例如,如果我想将几个不同的websocket端点设置到同一代理,我将不得不在两个不同的地方管理路由。如果可能的话,我想远离这个。
答案 0 :(得分:3)
我在尝试调试socket.io问题时偶然发现了你的问题...我在AWS上使用nginx进行设置,所以希望这些都有帮助。
我认为让websocket在nginx中工作的关键是上游配置:
upstream ws_NodeAppName {
ip_hash;
server 127.0.0.1:3000;
}
location ~ ^/(NodeAppName|NodeAppName\/socket.io) {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://ws_NodeAppName;
}
我的方法的一个警告是,客户端收到的页面不是从节点应用程序提供的,因此节点应用程序只是设置套接字。
如果以这种方式设置,则需要明确指定套接字的路径。
客户端:
var socket = io.connect(window.location.origin,
{
path: '/NodeAppName/socket.io'
});
SERVER:
var io = require('socket.io')(http, {
path: '/NodeAppName/socket.io'
});
我希望有所帮助!它可能是卑鄙地试图让这个正确配置..我正在翻滚兔子洞试图确定是什么导致我的零星504错误。