我有一个Nginx服务我的余烬构建 如下:
server {
listen 80;
root /home/ubuntu/my-app/dist;
index index.html;
location /api {
proxy_pass http://127.0.0.1:3000;
}
location / {
try_files $uri $uri/ /index.html;
}
}

我想使用socket.io添加聊天,但我已经在端口3000上安装了REST API。 我想知道建立这个的最好方法是什么。
我以为我可以按如下方式添加其他位置:
location /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://socket_nodes;
}

但它没有用。如果有人能指出我正确的方向,那真的很棒。
提前感谢。
答案 0 :(得分:0)
如果您使用node作为您的Web服务器,那么socket.io
将共享与Web服务器和REST API相同的端口和IP。
socket.io连接作为/socket.io
路径的常规http请求开始。 socket.io库挂钩到您的Web服务器以处理该特定的http请求。经过几次来回,两端同意将协议从http“升级”到webSocket,然后会话继续作为webSocket协议,但仍然与webServer运行的IP和端口相同。
如果您按照我之前提供给您的configuration link中的指定配置nginx,所有这些都可以正常使用nginx,以便代理所有正确的东西,并且如果socket.io与您的nodejs服务器配置正确正确地勾住它。
由于Web请求和socket.io连接都在同一个Web服务器上运行而您无需执行任何操作,因此实际上无需进行体系结构更改。 socket.io连接只是向/socket.io
路径发出http请求,并设置了一些特殊的HTTP头。 socket.io服务器代码只是挂钩到您的Web服务器以处理该特定请求并从那里获取它。其余的REST API调用只是由您已有的相同机制处理。因此,只要您不尝试为/socket.io
定义API调用,两者就会很乐意彼此保持一致,就像您的Web服务器上两条不同路由的处理程序彼此不同一样办法。您可以看到有关传入socket.io
来电如何工作的更多信息in this answer。
答案 1 :(得分:0)
所以我终于开始工作,并且认为我会分享我的发现。
<强> Nginx的强>: 对于我的api代理,我实际上可以与我的节点API共享相同的端口。我只需要添加版本和标题。
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
<强> server.js 强>
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket) {
console.log("[NOTIFICATION] - New connection");
io.sockets.emit("message", { message: "New connection" });
socket.on("send", function(data) {
io.sockets.emit("message", { message: data.message });
});
http.listen(3000);
<强>灰烬:强> https://github.com/keydunov/emberjs-socketio-chat 是一个很好的例子,并使用socket.io