是否可以使nodejs脚本侦听同一端口

 心若在梦就在_2012 发布于 2023-02-07 13:01

我在另一个线程中问了同样的问题,但是答案误解了我的问题,因此我再次提出了

我有两个脚本

 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。如果他们做的一样,为什么会有两个文件?如果他们在做其他事情,那么为什么一半的用户会得到不同的结果?看来您正在尝试做一些非常糟糕的事情。

2 个回答
  • 群集执行此操作,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)进行处理。我想说的出奇的简单。我喜欢节点。

    2023-02-07 13:03 回答
  • 哦,这就是事实:多个进程可以在同一端口上侦听。我知道两种情况(仅在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。如果他们做的一样,为什么会有两个文件?如果他们在做其他事情,那么为什么一半的用户会得到不同的结果?看来您正在尝试做一些非常糟糕的事情。

    2023-02-07 13:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有