【问题标题】:http server and web sockets from separate servers来自不同服务器的 http 服务器和 web 套接字
【发布时间】:2014-08-27 12:40:32
【问题描述】:

配置一个 http 服务器(使用 express)和分配给它的套接字服务器 (socket.io) 非常容易:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

如何在两个不同的 node.js 实例中运行 http 服务器和套接字服务器

我的想法是以这种方式利用性能,将 http 节点实例从将通知发送回客户端的责任中解放出来。

【问题讨论】:

  • 运行两个不同的进程?
  • 是的。除了这两个之外,我还会运行一个节点实例作为后端,向 http 服务器提供数据库内容,并(在需要时)向套接字服务器提供通知。

标签: node.js express socket.io


【解决方案1】:

在常规的 Socket.IO + Express 应用中,Socket.IO 拦截以/socket.io/ 开头的请求。

您可以设置 Nginx(或任何其他支持代理的网络服务器)监听 80 端口,如果请求以 /socket.io/ 开头,则使其代理到 Socket.IO 进程,否则代理到 Express 进程。

编辑:要在单独的进程中设置 Socket.IO,您可以使用以下代码:

var io = require('socket.io')();
io.on('connection', function(socket){
    //here you can emit and listen messages
});
io.listen(3000);

【讨论】:

  • 谢谢,这是有道理的......为了让它工作,我如何将 io 对象“传递”给另一个进程(这是我的主要问题)?请查看问题中的代码 sn-p - http(express)和 io(socket.io)服务器都是在同一个节点实例中创建的。我需要有两个节点实例运行这些服务器。其他方法是最初在单独的节点实例上创建快速服务器和 socket.io。这可能吗?
  • 不幸的是,您不能像将对象传递给函数那样将对象传递给不同的进程。我认为您必须实现诸如进程间消息传递之类的东西。看看this topic,可能对你有帮助。
  • "在不同的节点实例上创建 express server 和 socket.io。这可能吗?" - 是的,这是可能的。看看我的编辑
  • 如果我理解得很好,这个想法是从第一个节点实例启动 express 服务器,然后从第二个实例独立地 socket.io 服务器(socket.io 将创建自己的 http 服务器,这将是对我来说“隐形”)。是这样吗?
  • 是的,你是对的,除了 socket.io 服务器不会不可见。如果请求以/socket.io/ 开头,它将可以访问。您必须设置 nginx,以便它将此类请求代理到 socket.io 服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多