Node.JS永远在Heroku上

所以,我需要在heroku上运行我的node.js应用程序,它工作得很好,但是当我的应用程序崩溃时,我需要重新启动它,所以我永远添加到package.json,并创build了一个名为forever.js的文件这个:

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); 

在我的Proc文件(该heroku使用知道该怎么开始)我说:

 web: node forever.js 

好的! 现在,每当我的应用程序崩溃它自动重新启动,但时不时(几乎每1小时),Heroku开始投掷H99 – 平台错误,关于这个错误,他们说:

不像所有其他的错误,这将需要你采取行动纠正,这不需要你采取行动。 在一分钟内再次尝试,或检查状态网站。

但是,我只是手动重启我的应用程序,错误消失,如果我不这样做,它可能需要几个小时才能自行消失。

有人能帮我一下吗? 也许这是一个永远的问题? Heroku问题?

这是一个免费的Heroku帐户的问题:Heroku自动杀死未付费的应用程序,在1小时不活动后,然后在下一次请求进入时将其重新备份(如下所述,这不适用于付费帐户。多达两台服务器,并为第二台服务器支付,你会得到两个永远在线的服务器。) – https://devcenter.heroku.com/articles/dynos#dyno-sleeping

这种行为可能不会forever玩得很好。 要确认这一点,运行heroku logs并寻找“怠速”和“停止与SIGTERM过程”行,然后看看接下来会发生什么。

您可能需要尝试使用Cluster API,并在每次死亡时自动创build一个新的子项,而不是forever使用。 http://nodejs.org/api/cluster.html#cluster_cluster是一个很好的例子,你只需要把你的代码放到else块中。

结果是你的应用程序现在更加稳定,再加上它可以使用所有可用的CPU核心(我的经验是4)。

缺点是你不能在内存中存储任何状态。 如果您需要存储会话或其他内容,请尝试使用免费的Redis To Go插件( heroku addons:add redistogo )。

以下是一个使用cluster和Redis To Go在heroku上运行的示例: https : //github.com/nfriedly/node-unblocker

更新:Heroku最近对免费应用程序的工作方式做了一些重大的改变,最大的一点是他们每天最多只能在线18小时,使其作为一个“真正的”networking服务器无法使用。 详情请参阅https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

更新2:他们再次改变它。 现在,如果您validation了您的ID,则可以不断运行1个免费的测功机: https : //blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours