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

问题描述:

我在使用不同域配置两个不同Node.js应用程序时遇到问题。有两个目录使用Node.js Express托管多个网站

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

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

我需要admin.abc.com指向表达管理员设置和abc.com表达设置。我已经虚拟主机安装两个站点侦听端口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

你还是托管在同一端口上的应用程序,使用相同的网络接口。所以当第二个应用程序启动时,它总是会找到正在使用的端口。即使在使用vhost时,您不应该使用不同的端口来托管吗?有关详细信息,请参见[此示例](http://stackoverflow.com/questions/9332865/how-should-i-organize-multiple-express-servers-on-the-same-system)。也许你最好使用node-http-proxy来保持应用程序完全独立?请参阅[本文](http://nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/)进行比较。 – veggiesaurus

+0

感谢@veggiesaurus节点-http代理应该是要走的路。会告诉你这件事的进展的。 – Pradino

+0

请做。我已经添加了一个更详细的问题的答案,以防其他人遇到此问题。 – veggiesaurus

我不知道你是如何使用虚拟主机。首先用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'); 
} 

你只需要运行主express应用程序启用vhost使用永远。

+1

如果存在性能问题或其他问题同样的设置被用来运行一个更大的数字(比如20)的快速应用程序? 而且,我们假设其中的19个非常轻量级(表示呈现简单的Jade模板) - 但第20个稍微复杂一些,需要更多的CPU。如果我在20个网站中每个网站都有10个活跃用户,那么查看更复杂网站的10个网站会导致另外19个网站的观众减速? –

+0

@StandardQuality。 vhost的问题在于所有这些独立的*应用程序都在同一个用户空间中运行。这可能需要在单独的空间中运行它们(如apache中的suexec),以便如果一个站点遭到黑客攻击/崩溃,则无法感染其他站点。尽管如此,这个例子可能并不重要。看看pm2:http://pm2.keymetrics.io/docs/usage/startup/#user-permissions – cmroanirgo

您在相同的端口上使用相同的网络接口托管应用程序。所以当第二个应用程序启动时,它总是会找到正在使用的端口。如果你想在同一个端口上使用多个应用程序,他们都需要有自己的网络接口。使用vhost时,您仍然需要为每个应用程序侦听不同的端口。详细信息请参见this example。如果您希望自己的应用完全独立,最好使用node-http-proxy。这允许您在端口80上托管一个代理,该端口转发请求以表达在不同端口上侦听的应用程序。如果其中一个应用程序崩溃,它不会使其他应用程序崩溃,这与vhosts方法不同。 This post给出了一个使用node-http-proxy实现的例子。

感谢@veggiesaurus指向node-http-proxy。道歉迟到张贴。

这是我如何解决使用node-http-proxy

文件夹结构我的问题:

  • WWW/
    • 服务器。JS
    • ABC/[快速安装]
      • app.js
    • XYZ/[表达管理员设置]
      • 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