使用 Node.js Express 托管多个网站

Host multiple websites using Node.js Express

我在配置具有不同域的两个不同 Node.js 应用程序时遇到问题。有两个目录

"/abc/" -> express-admin setup (backend) -> admin.abc.com

"/xyz/" -> express setup (frontend) -> abc.com

我需要 admin.abc.com 指向 express-admin 设置和 abc.com 表示设置。我安装了 vhost,并且两个站点都侦听端口 80。

已添加

app.use(vhost('abc.com', app)); // xyz/app.js file
app.use(vhost('admin.abc.com', app)); // abc/app.js file

我的问题:

您在同一个端口上托管应用程序,使用同一个网络接口。所以当第二个应用程序启动时,它总是会找到正在使用的端口。如果你想在同一个端口上使用多个应用程序,它们每个都需要有自己的网络接口。使用 vhost 时,您仍然需要为每个应用监听不同的端口。请参阅 this example for details. If you would like your apps to be completely independent, you're better off using node-http-proxy. This allows you to host a proxy on port 80 which forwards requests to express apps listening on different ports. If one of these apps crashes, it will not crash the other app, unlike the vhosts approach. This post 给出了使用 node-http-proxy 的实现示例。

我不确定您是如何使用虚拟主机的。首先,使用 vhost 方法,您只需要 运行 一个 express 应用程序。不是两个。这是一个例子。

var express = require('express');
var vhost = require('vhost');

/*
edit /etc/hosts:

127.0.0.1       api.mydomain.local
127.0.0.1       admin.mydomain.local
*/

// require your first app here

var app1 = require("./app1");

// require your second app here

var app2 = require("./app2");

// redirect.use(function(req, res){
//   if (!module.parent) console.log(req.vhost);
//   res.redirect('http://example.com:3000/' + req.vhost[0]);
// });

// Vhost app

var appWithVhost = module.exports = express();

appWithVhost.use(vhost('api.mydomain.local', app1)); // Serves first app

appWithVhost.use(vhost('admin.mydomain.local', app2)); // Serves second app

/* istanbul ignore next */
if (!module.parent) {
  appWithVhost.listen(8000);
  console.log('Express started on port 8000');
}

您只需要 运行 使用永久启用虚拟主机的主要 Express 应用。

感谢@veggiesaurus 指出 node-http-proxy。抱歉发帖晚了。

以下是我使用 node-http-proxy

解决问题的方法

文件夹结构:

  • www/
    • server.js
    • abc/ [快速设置]
      • app.js
    • xyz/ [快速管理设置]
      • node_modules/express-admin/app.js

"abc" 和 "xyz" 在端口 x.x.x.x:3001 和 x.x.x.y:3002

上有自己的设置和 运行ning

我安装了 node-http-proxy 并使用以下代码添加了 server.js 文件。提到这个link

var http = require('http');
var httpProxy = require('http-proxy');

var proxy = httpProxy.createProxy();
var options = {  
  'abc.com': 'http://x.x.x.x:3001',
  'xyz.com': 'http://x.x.x.y:3002'
}

http.createServer(function(req, res) {
  proxy.web(req, res, {
    target: options[req.headers.host]
  });
}).listen(80);

最后,用于永远 运行 所有 3 个应用程序设置为 运行 永远在端口 3001、3002 和 80 中。

const express = require("express");
const app = express();
const fs = require('fs');
app.use((req, res, next) => {
    let reqDomain = req.get("host");
    if (reqDomain.indexOf(":") > -1) {
        reqDomain = reqDomain.split(":")[0];
    }
    if(reqDomain.endsWith(".local")) {
        reqDomain = reqDomain.substring(0, reqDomain.length - 6);
    }
    const domainPath = "public/" + reqDomain;
    let filePath = domainPath + req.originalUrl;
    filePath = fs.lstatSync(filePath).isDirectory() ? filePath + "/index.html" : filePath;
    console.log(__dirname + "/" + filePath);
    res.sendFile(filePath, { root: __dirname });
});
const port = process.env.PORT || 80;
app.listen(port, () => console.log("Server Started on Port " + port));

public 目录中放置您的文件夹,如 'my-first-website.com'、'my-second-website.com'

要在本地进行测试,请在 /etc/hosts

中添加以下内容
127.0.0.1 my-first-website.com.local
127.0.0.1 my-second-website.com.local