2011-12-28 71 views
9

所以,我需要在heroku上運行我的node.js應用程序,它工作得很好,但是當我的應用程序崩潰時,我需要重新啓動它,所以我永遠添加到package.json ,並創建了一個名爲forever.js文件與此:Node.JS與Heroku永遠在一起

var forever = require('forever'); 

var child = new (forever.Monitor)('web.js', { 
    max: 3, 
    silent: false, 
    options: [] 
}); 

//child.on('exit', this.callback); 
child.start(); 

forever.startServer(child); 

我Procfile(即Heroku的使用要知道開始什麼)我把:

web: node forever.js 

好吧!現在,每次我的應用程序崩潰,自動重新啓動,但是,從時間到時間(幾乎每隔1小時),Heroku的開始投擲H99 - 平臺誤差,這個誤差,他們說:

不同於所有其他錯誤這將需要您採取措施進行糾正,這不需要您採取任何行動。在一分鐘內再試一次,或檢查狀態網站。

但我只是手動重新啓動我的應用程序,錯誤消失,如果我不這樣做,它可能需要幾個小時才能自行消失。

任何人都可以幫助我嗎?也許這是一個永遠的問題? Heroku問題?

+0

您是否碰巧明白了原因? – pars 2012-02-25 12:38:13

+1

不,但我永遠刪除,它不需要在heroku,你應該避免錯誤,所以你的應用程序繼續運行 – 2012-03-05 01:25:20

+2

那麼heroku自動重新啓動你的應用程序時,它現在崩潰了嗎? – hellatan 2012-03-10 22:03:47

回答

8

這是免費的Heroku帳戶的問題:Heroku在閒置1小時後會自動殺死未付費的應用,然後在下一次請求進入時將其恢復。(如下所述,這不適用於付費帳戶。如果您擴展到兩臺服務器併爲第二臺服務器支付費用,您將獲得兩臺永遠在線的服務器。) - https://devcenter.heroku.com/articles/dynos#dyno-sleeping

此行爲可能不會與forever配合良好。要確認這一點,請運行heroku logs並查找「空閒」和「使用SIGTERM停止進程」行,然後查看接下來會發生什麼。

您可能不想使用forever,而是嘗試使用Cluster API,並在每次死亡時自動創建一個新子。 http://nodejs.org/api/cluster.html#cluster_cluster就是一個很好的例子,您只需將代碼放入else區塊即可。

結果是,你的應用程序現在更加穩定,再加上它可以使用所有可用的CPU核心(我的經驗是4)。

缺點是你不能在內存中存儲任何狀態。如果您需要存儲會話或其他內容,請嘗試使用免費的Redis To Go插件(heroku addons:add redistogo)。

這裏的,因此目前在Heroku上使用cluster和Redis的去跑步爲例:https://github.com/nfriedly/node-unblocker

UPDATE:Heroku的最近取得免費應用程式如何運作的一些重大變化,而大者,他們只能爲在線每天最多18小時,使其無法作爲「真正」的網絡服務器使用。詳細信息在https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

更新2:他們再次改變它。現在,如果您驗證了您的ID,則可以不斷運行1個免費的測功機:https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours

+1

你說得對,Heroku完成這項工作,不過對於免費的單一測試應用程序來說,有償層級總是保持不變。 – 2012-11-12 14:13:36

+2

另外,工作進程永遠不會閒置 – kgilpin 2013-08-07 21:45:35

+1

您可以使用監控服務,將永遠保持ping你的服務器,從而保持其aliveeee – 2015-03-27 03:39:06