NodeJS Express - 同一端口上的两个 NodeJS 实例(vhost)

Posted

技术标签:

【中文标题】NodeJS Express - 同一端口上的两个 NodeJS 实例(vhost)【英文标题】:NodeJS Express - Two NodeJS instances on same port (vhost) 【发布时间】:2018-08-15 06:53:45 【问题描述】:

我正在尝试从不同的server.js 文件(不同的目录、配置等)在同一端口和服务器上运行 2 个 NodeJS 实例。我的服务器提供商给了我一个信息,vhost 正在为不同的域运行,这就是问题所在。如何在 NodeJS Express 应用程序中处理它?我试过像这样使用https://github.com/expressjs/vhost中的vhost

const app = express();
const vhost = require('vhost');

app.use(vhost('example1.org', app));

// Start up the Node server
app.listen(4100, () => 
  console.log(`Node server listening on 4100`);
);

对于这样的第二个应用程序:

const app = express();
const vhost = require('vhost');

app.use(vhost('example2.org', app));

// Start up the Node server
app.listen(4100, () => 
  console.log(`Node server listening on 4100`);
);

但是当我尝试运行第二个实例时,我得到了EADDRINUSE ::: 4100,所以 vhost 在这里不起作用。

你知道怎么解决吗?

【问题讨论】:

你不能从两个不同的进程监听同一个端口。尝试使用不同的端口并设置 http 服务器,以便它将对每个域的请求重定向到相应的端口。您使用的是什么服务器:nginx、Apache...? 我是LiteSpeed Web Server litespeedtech.com/products/litespeed-web-server 我从未使用过它,但设置它以将请求转发到 Node 应用程序的过程记录在此:litespeedtech.com/support/wiki/doku.php/… 要么从同一个进程中为两个域提供服务,要么更改其中一个端口(这是我的建议)。 我以为我可以像上面写的那样做,但你说得对,我在不同的端口上创建了两个服务器。 【参考方案1】:

您只能让一个进程监听一个端口,不仅在 Node.js 中,而且通常情况下(此处不适用的例外情况除外)。

您可以通过以下两种方式之一实现您所需要的:

结合节点应用

您可以将应用程序集成到一个应用程序中,侦听一次,然后将请求转发给每个主机以分离代码段 - 如果您仍想实现代码分离,单独的代码段可以是实际编写的 NPM 模块,并且保持隔离。

使用网络服务器代理请求

您可以在某个空闲端口(例如 5000 和 5001)上运行 2 个节点进程,并使用网络服务器根据主机自动将请求转发给它。我会为此推荐 Nginx,因为它的代理功能相对容易设置且功能强大。它在不使用太多系统资源方面也相当不错。 Apache 和其他也可以用于此目的,但我个人的偏好是 Nginx。

结论

我的建议是您安装一个网络服务器并将暴露端口上的请求转发到单独运行的节点进程。我实际上建议您在代理后面运行节点作为项目的默认设置,并且仅在特殊情况下直接公开它。如果您的应用已经涉及到经过良好加固的服务器设置,您将获得很多配置选项、安全性和可扩展性优势。

【讨论】:

以上是关于NodeJS Express - 同一端口上的两个 NodeJS 实例(vhost)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 中使用 http 模块在同一端口上打开 IPv4 和 IPv6 套接字?

如何在同一个端口上运行 express 和 socket.io

多个域上的 Node.js 使用 express.vhosts()

NodeJS (Express + PUG) MVC 端口检查器

如何在同一个端口上运行 Node Express 服务器和 Angular?

NodeJs - express 和 socket.io 同端口集成