在多个node.js HTTP进程中共享一个端口

我有一个根服务器上运行几个node.js项目。 他们应该在自己的进程和目录中分别运行。 考虑这个文件结构:

/home +-- /node +-- /someProject | www.some-project.com | +-- index.js | +-- anotherFile.img | +-- ... +-- /anotherProject | www.another-project.com | +-- /stuff | +-- index.js | +-- ... +-- /myWebsite | www.my-website.com | +-- /static | +-- index.js | +-- ... +-- ... | ... 

每个index.js都应该以cwd设置为其父文件夹( someProjectanotherProject等)的单个进程启动。

想想主机。 每个项目启动一个networking服务器,它监听自己的域名。 还有问题。 只有一个脚本可以启动,因为它们都尝试绑定到端口80.我child_process.fork() node.js API并寻找可能的解决scheme: child_process.fork()

可悲的是这不太好。 当我尝试发送一个服务器实例到主进程(稍后发出一个请求)或一个requestresponse从主服务器到从服务器时,我得到错误。 这是因为node.js内部尝试将这些高级对象转换为JSONstring,然后将其重新转换为其原始forms。 这使得所有的对象都失去了参考和function。

第二种方法child.js

 var http = require("http"); var server = http.createServer(function(req, res) { // stuff... }); server.listen(80); process.send(server); // Nope 

master.js

 var http = require("http"), cp = require("child_process"); var child = cp.fork("/home/node/someProject/index.js", [], { env: "/home/node/someProject" }); var router = http.createServer(function(req, res) { // domaincheck, etc... child.send({ request: req, response: res }); // Nope }); router.listen(80); 

所以这是一个死路一条。 但是,嘿! Node.js提供了一些可以发送的句柄。 以下是文档中的一个示例:

master.js

 var server = require('net').createServer(); var child = require('child_process').fork(__dirname + '/child.js'); // Open up the server object and send the handle. server.listen(1337, function() { child.send({ server: true }, server._handle); }); 

child.js

 process.on('message', function(m, serverHandle) { if (serverHandle) { var server = require('net').createServer(); server.listen(serverHandle); } }); 

这里的孩子直接听主人的服务器。 所以在这之间没有任何域名检查。 所以这里是死路一条。

我也想过关于Cluster ,但是它使用了与手柄相同的技术,因此也具有相同的局限性。

那么…有什么好主意吗?

我目前所做的是相当黑客。 我做了一个叫做distroy的包。 它绑定到端口80,并在内部代理所有请求到Unix域套接字path,如/tmp/distroy/http/www.example.com ,在这些单独的应用程序侦听。 这也(有点)适用于HTTPS(请参阅我的SNI问题)。 剩下的问题是,原来的IP地址丢失了,因为现在总是127.0.0.1。 我想我可以通过monkeypatchingnetworking绕过这个服务器,以便我可以在打开连接之前传输IP地址。

就个人而言,我只是让他们都听专用的端口或最好是插座,然后把所有的东西都放在专用的路由器脚本或nginx之后。 这是IMO最简单的方法。

如果您对node.js解决方案感兴趣,请查看node.js中的bouncy ,websocket和支持https的http路由器代理/负载均衡器。

定义你的routes.json

  { "beep.example.com" : 8000, "boop.example.com" : 8001 } 

然后运行弹性使用

  bouncy routes.json 80 

对于连接中间件有虚拟主机扩展。 也许你可以复制他们的一些概念。