2014-03-05 23 views
1

所以這是我的嘗試,我被卡住了。 我有一個超過10個虛擬主機的apache2 web服務器。所有域都通過虛擬主機綁定到服務器ip和apache路由,因此每個域都獲得它的正確內容。這個工作已經有幾年了。 現在的挑戰:我現在有一些webApps,在這個服務器上用node.js編寫。當我想運行一個應用程序時,我必須調用一些鏈接,如:mynodeapp.com:3000,具體取決於我運行應用程序的端口。 我現在想讓node.js做所有的路由,而不是apache。我改變了apache的監聽端口9000,並且希望運行一個寫在節點上的代理,該代理處理端口80上的所有請求。我認爲這可以通過node-http-proxy實現。我認爲這更像是轉發,所以我想爲節點代理程序如下:用node.js後面的虛擬主機運行Apache代理

httpProxy = require('http-proxy'); 

httpProxy.createServer({ 
    forward: { 
    port: 9000, 
    host: 'localhost' 
    } 
}).listen(80); 

但這似乎一切都轉發獨立於req.host的。 有沒有人想法如何做到這一點?我需要轉發(或代理)傳入的網址(my.domain.com)得到它們,並將它們作爲一個整體轉發到端口9000(apache2運行),以便Apache中的虛擬主機可以處理剩下的任何想法。 最好的 馬丁

更新: 好吧,所以最後一切正常。它實際上是一個Apache的問題(錯誤的文件夾目的地....多麼愚蠢。) 下面我發佈我目前非常精細可行的解決方案是非常簡單:

var httpProxy = require('http-proxy'); 
var http = require('http'); 
var util = require('util'); 
var url = require('url'); 

var options = { 
    target: 'some-domain.com:9000', 
    target: 'another-domain.com:9000' 
} 

var proxy = httpProxy.createProxyServer(options); 

http.createServer(function(req, res, err) { 
    if(err) console.log(err); 
    var host = util.inspect(req.headers.host); 
    console.log(req.connection.remoteAddress + ' asks for: ' + host + req.url); 

    proxy.web(req, res, function(err) { 
    if(err) console.log(err); 
    }); 
}).listen(80); 

console.log('Awesome proxy is listening on port 80...'); 

回答

1

Apache的名字虛擬主機着眼於Host字段在請求頭中。它們可以全部運行在相同的IP和端口上。

NameVirtualHost *:9000 

<VirtualHost *:9000> 
    DocumentRoot /var/www/site1 
    ServerName site1.com 
</VirtualHost> 

<VirtualHost *:9000> 
    DocumentRoot /var/www/site2 
    ServerName site2.com 
</VirtualHost> 

ServerName指令告訴虛擬服務器除了

在您的代理代碼,請務必正確填寫「主機」字段。

0

我碰上了類似的解決方案,讓代理背後的Apache節點的應用程序,但通過Apache運行80個STANDAR虛擬主機和連接的Node.js應用:

https://stackoverflow.com/a/30287224/3617531

希望它可以幫助任何人