2011-12-28 69 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