Using node, socket.io, ember.js and nginx



我有一个 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;
  }

但它不起作用。如果有人能指出我正确的方向,那就太好了。

提前谢谢。

如果您使用 node 作为您的 Web 服务器,那么socket.io与 Web 服务器和您的 REST API 共享相同的端口和 IP。

socket.io 连接最初是对/socket.io路径的常规 http 请求。 socket.io 库挂钩到您的 Web 服务器以处理该特定的 http 请求。 经过几次来回之后,两端同意将协议从http"升级"到webSocket,然后对话继续作为webSocket协议,但仍与Web服务器在同一IP和端口上运行。

如果您按照我之前给您的配置链接中指定的方式配置 nginx,以便它代理所有正确的东西,并且如果 socket.io 与您的 nodejs 服务器正确配置以正确挂钩,所有这些都可以很好地使用 nginx 作为代理。

实际上不需要进行架构更改,因为 Web 请求和 socket.io 连接都通过同一个 Web 服务器运行,而无需您执行任何操作。 socket.io 连接只是向设置了一些特殊 HTTP 标头的/socket.io路径发出 http 请求。 socket.io 服务器代码只是挂接到您的 Web 服务器以处理该特定请求并从那里获取它。 其余的 REST API 调用仅由您已有的相同机制处理。 因此,只要您不尝试为/socket.io定义 API 调用,两者就会很乐意相互干扰,就像 Web 服务器上两个不同路由的处理程序不会相互妨碍一样。 您可以在此答案中看到有关传入socket.io呼叫如何工作的更多信息。

所以我终于把它解决了,我想我会分享我的发现。

嘟嘟:对于我的 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";
}

服务器.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

最新更新