2

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

在此处输入图像描述

你知道如何解决吗?

4

1 回答 1

6

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

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

合并节点应用程序

您可以将应用程序变成一个应用程序,侦听一次,然后将每个主机的请求转发到单独的代码位 - 如果您仍然想实现代码分离,单独的代码位可以是实际独立编写和维护的 NPM 模块.

使用网络服务器代理请求

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

结论

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

于 2018-03-07T08:57:39.647 回答