2015-07-22 168 views
6

我在使用不同域配置兩個不同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

回答

6

我不知道你是如何使用虛擬主機。首先用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

6

您在相同的端口上使用相同的網絡接口託管應用程序。所以當第二個應用程序啓動時,它總是會找到正在使用的端口。如果你想在同一個端口上使用多個應用程序,他們都需要有自己的網絡接口。使用vhost時,您仍然需要爲每個應用程序偵聽不同的端口。詳細信息請參見this example。如果您希望自己的應用完全獨立,最好使用node-http-proxy。這允許您在端口80上託管一個代理,該端口轉發請求以表達在不同端口上偵聽的應用程序。如果其中一個應用程序崩潰,它不會使其他應用程序崩潰,這與vhosts方法不同。 This post給出了一個使用node-http-proxy實現的例子。

6

感謝@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