2013-07-19 63 views
8

您是否設法在Heroku上進行Node + nginx代理設置?您是否設法在Heroku上設置節點nginx代理設置?

請問在你做「git push heroku master」之前,你是如何組織目錄結構和每個目錄中的文件的嗎?你使用了哪個buildpack?

我每次執行「git push heroku master」時都會收到消息「推送被拒絕,沒有Cedar支持的應用程序」。我已將「nginx.conf.erb」文件放在「/ conf」目錄中。

謝謝。

+0

大問題。 – Green

+0

我猜是因爲Heroku不允許你安裝nginx代理等。Heroku提供了一個Web服務器和一個緩存,你可以作爲插件來提供。 – stiebitzhofer

+0

如果你只是想要一個代理,而不是nginx,你可以使用substacks bouncy或nodejitsus http代理 – jpillora

回答

0

article包含關於在Heroku上將nginx設置爲代理的說明,以及OpenResty,Lua和LuaRocks。沒有提到node.js。它使用這buildpack。還沒有嘗試過自己,但似乎有人已經得到它的工作。

8

我在很多項目上使用過heroku上的Node.js + NGINX設置。 這樣,您可以讓nginx句柄提供靜態文件,緩存,代理到其他服務器以及代理到多個節點進程。

使用multi-buildpack buildpack(https://github.com/ddollar/heroku-buildpack-multi)。
它允許您指定一個指向多個buildpack的.buildpacks文件。 在我的.buildpacks文件中,我使用默認的Heroku Node buildpack和一個我重建的包含SSL支持的nginx buildpack的fork。

https://github.com/theoephraim/nginx-buildpack.git 
https://github.com/heroku/heroku-buildpack-nodejs.git 

nginx buildpack使用可引用ENV變量的nginx.conf.erb文件。你必須告訴它來聽由環境變量的Heroku指定的端口被稱爲「PORT」

listen <%= ENV["PORT"] %>; 

然後你有你的節點服務器上,你選擇的任何端口啓動,說5001,並在你的nginx的配置,你可以設置代理傳遞到您的節點應用:

location/{ 
    proxy_pass  http://127.0.0.1:5001; 
} 

注 - 您procfile需要使用特殊的啓動nginx的命令(Nginx的buildpack的一部分),然後調用其他任何你通過。在我來說,我用永遠運行我節點應用:

web: bin/start-nginx ./node_modules/.bin/forever app.js 

而且你的主節點文件中,你必須創建時,它已經成功啓動信號到nginx的buildpack應該開始聽

文件
fs.openSync('/tmp/app-initialized', 'w'); 

還有就是如何使用nginx的buildpack自述@https://github.com/theoephraim/nginx-buildpack

+1

你怎麼能夠創建另一個節點應用程序運行在端口5000?從我所遇到的情況來看,你只能使用一個端口,這是ENV默認的端口。如果情況並非如此,請告訴我如何做到這一點。謝謝。 –

+1

你可以啓動幾個「apps」在你想要的任何端口上運行。關鍵是Heroku只會通過他們選擇的單個端口傳遞http流量(設置爲PORT env var)。因此,如果您想將多個應用展示給網絡,則需要使用偵聽該端口的nginx代理將流量傳遞到節點應用。 – theozero

+0

在Heroku上,您無法在我的經驗中爲我指定特定的端口以下作品: 上游node_entry { \t server unix:/tmp/nginx.socket fail_timeout = 0; } server { \t listen <%= ENV ['PORT']%>; \t server_name localhost; \t keepalive_timeout 5; \t位置/ { \t \t [其它設置...] \t \t proxy_pass HTTP:// node_entry; \t} } 然後,可以與連接: \t Server.listen(「/ TMP/nginx.socket」); –

0

在Heroku上一個完整的解釋,這個設置是在生產中使用由我一旦成功安裝了buildpack:

upstream node_entry { 
    server unix:/tmp/nginx.socket fail_timeout=0; 
} 
server { 
    listen <%= ENV['PORT'] %>; 
    server_name localhost; 
    keepalive_timeout 5; 
    location/{ 
     [other settings…] 
     proxy_pass http://node_entry; 
    } 
} 

然後,在你app.js文件,你可以連接:

Server.listen(‘/tmp/nginx.socket’); 
+0

沒有爲我工作。得到了'buildpack = nginx at = exit process = nginx',然後'狀態從開始變爲崩潰。 – paradite

+0

@paradite你可以發佈你的節點代碼嗎?它會工作:-) –

+0

@ droid-zilla - 如果可能,你會介意發佈你的git存儲庫嗎?我想設置一個反向代理,以便我的客戶端代理調用不同的heroku dyno/server/url上的api。或者如果你知道我可以看看的例子嗎?謝謝 –