我在配置具有不同域的两个不同Node.js应用程序时遇到问题。有两个目录
"/abc/" -> express-admin setup (backend) -> admin.abc.com
和
"/xyz/" -> express setup (frontend) -> abc.com
我需要 admin.abc.com 指向快速管理员设置和 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
我的问题:
,每当我启动这两个应用程序时,第二个应用程序始终停止。我尝试为两个应用程序使用不同的端口,但仍然有相同的错误。他们单独运行没有问题。
我认为我的设置过于复杂,无法进行域名转发。有更好的建议吗?可能是我有一个主app.js文件,我可以使用它来将域路由到各自的应用程序,而无需使用每个应用程序的app.js。
答案 0 :(得分:7)
我不确定你是如何使用vhost的。首先使用vhost方法,您只需要运行一个快速应用程序。不是两个。这是一个例子。
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');
}
您只需要在永久使用vhost的情况下运行主Express应用程序。
答案 1 :(得分:6)
您使用相同的网络接口在同一端口上托管应用程序。因此,当第二个应用程序启动时,它将始终找到正在使用的端口。如果要在同一端口上使用多个应用程序,则每个应用程序都需要拥有自己的网络接口。使用vhost时,您仍然需要为每个应用程序侦听不同的端口。有关详细信息,请参阅this example。如果您希望自己的应用完全独立,最好使用node-http-proxy。这允许您在端口80上托管代理,该代理转发请求以表达在不同端口上侦听的应用程序。如果其中一个应用程序崩溃,它将不会崩溃其他应用程序,这与vhosts方法不同。 This post给出了使用node-http-proxy实现的示例。
答案 2 :(得分:6)
感谢@veggiesaurus指向node-http-proxy。道歉迟到了。
以下是我使用node-http-proxy
解决问题的方法文件夹结构:
“abc”和“xyz”有自己的设置并在端口x.x.x.x上运行:3001和x.x.x.y:3002
我安装了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中永久运行。