【问题标题】:Using node, socket.io, ember.js and nginx使用 node、socket.io、ember.js 和 nginx
【发布时间】:2015-02-11 21:54:20
【问题描述】:

我有一个 Nginx 服务于我的 ember 构建 如下:

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;
  }

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

提前致谢。

【问题讨论】:

  • 有没有研究过socket.io具体的nginx文档:nginx.com/blog/nginx-nodejs-websockets-socketio
  • 我有,但我不清楚。因为已经有一个节点 api 在端口 3000 上侦听。我也想使用一个套接字,并且正在考虑在另一个端口上添加另一个代理。但我很确定有更好的方法来做到这一点。
  • Nginx 作为反向代理是最广为人知的场景。这意味着您可以通过同一端口代理任何本地/远程资源。分享 Nginx 日志,以便我们快速为您提供帮助
  • 这就是我要找的。如何与 socket.io 一起构建一个 rest API。 stackoverflow.com/a/21813645/3957625cmets 的 Ty。

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


【解决方案1】:

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

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

如果您按照我之前给您的configuration link 中指定的方式配置 nginx,那么所有这些都可以使用 nginx 作为代理正常工作,以便它代理所有正确的东西,并且如果您的 nodejs 服务器正确配置了 socket.io 以挂钩正确地进入它。

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

【讨论】:

    【解决方案2】:

    所以我终于让它工作了,我想我会分享我的发现。

    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

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 2018-05-18
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多