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

时间:2015-07-22 06:43:47

标签: node.js express subdomain vhosts forever

我在配置具有不同域的两个不同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。

3 个答案:

答案 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

解决问题的方法

文件夹结构:

  • WWW /
    • server.js
    • abc / [快速设置]
      • app.js
    • xyz / [express-admin setup]
      • node_modules /表达管理员/ app.js

“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中永久运行。