使用 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
我的问题:
forever 已安装,每当我启动这两个应用程序时,第二个总是停止。我尝试为两个应用程序使用不同的端口,但仍然出现相同的错误。他们单独 运行 没有问题。
我认为我的设置对于域转发来说太复杂了。有更好的建议吗?可能是我有一个主 app.js 文件,我可以使用它来将域路由到它们各自的应用程序,而无需使用每个应用程序的 app.js。
您在同一个端口上托管应用程序,使用同一个网络接口。所以当第二个应用程序启动时,它总是会找到正在使用的端口。如果你想在同一个端口上使用多个应用程序,它们每个都需要有自己的网络接口。使用 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
我在配置具有不同域的两个不同 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
我的问题:
forever 已安装,每当我启动这两个应用程序时,第二个总是停止。我尝试为两个应用程序使用不同的端口,但仍然出现相同的错误。他们单独 运行 没有问题。
我认为我的设置对于域转发来说太复杂了。有更好的建议吗?可能是我有一个主 app.js 文件,我可以使用它来将域路由到它们各自的应用程序,而无需使用每个应用程序的 app.js。
您在同一个端口上托管应用程序,使用同一个网络接口。所以当第二个应用程序启动时,它总是会找到正在使用的端口。如果你想在同一个端口上使用多个应用程序,它们每个都需要有自己的网络接口。使用 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