2014-01-24 60 views
0

我有一個在域foo.com下運行的heroku node.js應用程序。我想將所有以foo.com/bar/開頭的網址代理到第二個node.js進程 - 但我希望在同一個heroku應用程序中控制進程。這可能嗎?heroku:將子目錄路由到第二個node.js應用程序?

如果沒有,是否有可能代理一個子目錄到第二個heroku應用程序?我一直無法控制如何在Web應用程序入口點之外進行路由。也就是說,我可以很容易地使用Express來控制node.js中的路由,但這不會讓我代理不同的應用。

我最後的手段是簡單地使用子域而不是子目錄,但我想看看是否有可能的第一個子目錄。謝謝!

編輯:我必須使用http-proxy解決我的問題。我有兩個快速服務器在不同的端口上偵聽,然後是第三個面向外部的服務器,這個服務器根據URL來路由到兩個服務器中的任何一個。當然不是理想的,但我無法得到任何其他工作。下面介紹的wrap-app2方法有一些我無法弄清的url問題。

回答

0

只需創建一個新的Express服務器,並把中間件的主要一個重定向到二級時,涉及到你想要的路徑的請求:

var app2 = express(); 

    app2.use(function(req, res){ 
     res.send('Hey, I\'m another express server'); 
    }); 

    app.use('/foo', app2); 

我沒有在Heroku上嘗試過,但它是相同的過程,並不創建任何新的TCP綁定或進程,所以它會工作。作爲參考,a modified plain express template

如果你真的想要其他快速處理連接,你需要使用集羣。檢查worker.send utility

app.use('/foo', function(req,res){ 
     //You can send req too if you want. 
     worker.send('foo', res); 
    }); 
+0

這實際上並沒有工作,因爲一些奇怪的行爲,當它被app2處理時,路徑被重複。無法準確記住這種行爲,但app2會看到像'/ foo/foo/...'這樣的網址,而不是'/ foo/...'。 –

0

這是可能的。我能想到的最優雅的方式是使用集羣。 1 Heroku Dyno包含四個內核。因此,您可以將四個工作線程運行到節點進程。

這是introduction to clustering

你在看什麼是初始化兩個快遞app(假設你使用快遞)並在兩個工作線程中爲這兩個服務。

if (cluster.isMaster) { 
    // let's make four child processes 
    for (var i = 0; i < 4; i++) { 
     if (i%2 == 0) { 
      cluster.fork(envForApp1); 
     } else { 
      cluster.fork(envForApp2); 
     } 
    } 
} else { 
    // refer to NODE_ENV and see whether this should be your app1 or app2 
    // which should be started. This is passed from the fork() before. 

    app.listen(8080); 
} 
相關問題