使用node,socket.io,ember.js和nginx

时间:2014-12-13 06:47:56

标签: node.js ember.js nginx socket.io

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




但它没有用。如果有人能指出我正确的方向,那真的很棒。

提前感谢。

2 个答案:

答案 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