我在另一个线程中问了同样的问题,但是答案误解了我的问题,因此我再次提出了
我有两个脚本
s1.js, s2.js
两者都使用Express框架并监听某些端口。
我打电话
node s1.js //listens to port 8080 node s2.js //listens to port 8081
要启动这两个脚本,一个监听端口8080,另一个监听端口8081。
是否可以使nodejs脚本侦听同一端口8080?我打电话时如何分开两个脚本
www.abc.com:8080
欢迎您发表评论
更新的问题
我尝试代码app.js
var express = require("express"); var app = express(); app.use('/app1', require( './app1/index.js').app); app.use('/app2', require( './app2/index.js').app); app.listen(8081);
在路径./app1/index.js中
var express = require("express"); var app = express(); console.log("app1"); app.listen(8081);
在路径./app2/index.js中
var express = require("express"); var app = express(); console.log("app2"); app.listen(8081);
然后我打电话
node app
控制台报告错误:
app1 /Users/myname/node_modules/express/lib/application.js:111 if (fn.handle && fn.set) app = fn; ^ TypeError: Cannot read property 'handle' of undefined at Function.app.use (/Users/zhengwang/node_modules/express/lib/application.js:111:9) at Object.(/Users/zhengwang/multi.js:27:7) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:901:3
freakish.. 5
哦,这就是事实:多个进程可以在同一端口上侦听。我知道两种情况(仅在POSIX上):
1)分叉。当主进程在套接字上侦听然后分叉自身时,所有子进程将在同一套接字上侦听。这意味着多个进程在同一个套接字上侦听。而这实际上是Node.js集群的工作。您可能想看看它。
2)在两个独立的进程之间传递套接字文件描述符。是的,可以做到。但是,它涉及很多工作。基本上,两个进程通过UDS进行通信,其中一个将套接字文件描述符传递给另一个,因此另一个也可以侦听它。但是,这需要一些底层网络编程(传递套接字的FD并不像传递消息一样简单)。这是用C实现的示例:
http://lists.canonical.org/pipermail/kragen-hacks/2002-January/000292.html
我不确定是否可以使用Node.js完成2)。
请注意,在这两种情况下,操作系统都需要在进程之间进行负载平衡(由OS决定哪个进程处理accept
和/或recv
在套接字上)。据我所知,大多数操作系统都能很好地完成工作。
但是,这确实是不切实际的。我从未见过在现实生活中使用过的解决方案2)(极其复杂,存在一些严重的安全问题),而对于解决方案1)它已被(例如)Apache Web服务器广泛使用,但如今人们倾向于使用线程和/或异步方法系统,因此分叉变得有些过时(除非您想充分利用多个CPU内核-Node.js中没有线程)。
因此,在您的情况下,我想最简单的解决方案是在两个服务器前都放置一个(ha)代理,以便在这两个脚本之间实现负载平衡。
请注意,这个问题很奇怪。您说您有两个不同的服务器,但希望它们在同一端口上侦听。这意味着每个请求将转到其中一个。特别是一半用户将由处理,s1
而另一半用户将由处理s2
。如果他们做的一样,为什么会有两个文件?如果他们在做其他事情,那么为什么一半的用户会得到不同的结果?看来您正在尝试做一些非常糟糕的事情。
群集执行此操作,Express.vhost也执行此操作。实际上,您可以同时使用两者,并且只能一起使用1个端口。
// server.js var cluster = require('cluster'); var express = require('express'); var app = express (); var cpus = require('os').cpus().length - 1; if(cluster.isMaster) { for(var i=0;i<cpus;i++) { cluster.fork (); } } else { app .use( express.vhost('www.site1.com'), require('./site1.js').app ) ) .use( express.vhost('www.site2.com'), require('./site2.js').app ) ) .listen(8080); }
在site1.js,site2.js中,您可以像编写其他任何节点应用程序一样将它们写出来,除了两件事。导出您的应用程序(var app = exports.app = express()),不要在这两个文件中监听(app.listen(8080))。您可以看到server.js已经在为您监听,并且还需要从中导出两个“应用”。现在,同一服务器上的所有站点都可以在同一端口上运行,并且可以在该服务器上的每个CPU上运行。我相信您的服务器本身也需要针对多个虚拟主机进行正确设置,但这超出了所提问题的范围。
群集处理将请求发送到正在运行的节点应用程序之一(server.js),然后根据所使用的URL使用正确的应用程序(site1.js,site2.js)进行处理。我想说的出奇的简单。我喜欢节点。
哦,这就是事实:多个进程可以在同一端口上侦听。我知道两种情况(仅在POSIX上):
1)分叉。当主进程在套接字上侦听然后分叉自身时,所有子进程将在同一套接字上侦听。这意味着多个进程在同一个套接字上侦听。而这实际上是Node.js集群的工作。您可能想看看它。
2)在两个独立的进程之间传递套接字文件描述符。是的,可以做到。但是,它涉及很多工作。基本上,两个进程通过UDS进行通信,其中一个将套接字文件描述符传递给另一个,因此另一个也可以侦听它。但是,这需要一些底层网络编程(传递套接字的FD并不像传递消息一样简单)。这是用C实现的示例:
http://lists.canonical.org/pipermail/kragen-hacks/2002-January/000292.html
我不确定是否可以使用Node.js完成2)。
请注意,在这两种情况下,操作系统都需要在进程之间进行负载平衡(由OS决定哪个进程处理accept
和/或recv
在套接字上)。据我所知,大多数操作系统都能很好地完成工作。
但是,这确实是不切实际的。我从未见过在现实生活中使用过的解决方案2)(极其复杂,存在一些严重的安全问题),而对于解决方案1)它已被(例如)Apache Web服务器广泛使用,但如今人们倾向于使用线程和/或异步方法系统,因此分叉变得有些过时(除非您想充分利用多个CPU内核-Node.js中没有线程)。
因此,在您的情况下,我想最简单的解决方案是在两个服务器前都放置一个(ha)代理,以便在这两个脚本之间实现负载平衡。
请注意,这个问题很奇怪。您说您有两个不同的服务器,但希望它们在同一端口上侦听。这意味着每个请求将转到其中一个。特别是一半用户将由处理,s1
而另一半用户将由处理s2
。如果他们做的一样,为什么会有两个文件?如果他们在做其他事情,那么为什么一半的用户会得到不同的结果?看来您正在尝试做一些非常糟糕的事情。