所以,我需要在heroku上运行我的node.js应用程序,它运行得很好,但是当我的应用程序崩溃时,我需要重新启动它,所以我永远添加到package.json,并创建了一个名为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);
在我的Procfile上(heroku用来知道要开始的)我把:
web: node forever.js
好吗!现在,每当我的应用程序崩溃时,它会自动重启,但是,不时(几乎每1小时),heroku开始抛出H99 - 平台错误,关于这个错误,他们说:
与需要您纠正的所有其他错误不同,此错误不需要您采取任何措施。请稍后再试,或查看状态网站。
但是我只是手动重新启动我的应用程序并且错误消失了,如果我不这样做,它可能需要几个小时才能自行消失。
有人可以帮我吗?也许这是一个永远的问题?一个heroku问题?
答案 0 :(得分:10)
这是免费Heroku帐户的问题:Heroku会在1小时不活动后自动杀死未付费的应用,然后在下次请求时将其旋转回来。(如下所述,这不适用于付费帐户。如果您扩展到两台服务器并支付第二台服务器的费用,那么您将获得两台始终在线的服务器。) - https://devcenter.heroku.com/articles/dynos#dyno-sleeping
此行为可能无法与forever
很好地协作。要确认这一点,请运行heroku logs
并查找“空闲”和“使用SIGTERM停止进程”行,然后查看接下来会发生什么。
您可能希望尝试使用Cluster API,而不是使用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小时,这使得它无法像“真正的”网络服务器那样无法使用。详情请见https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos
更新2:他们再次改变了它。现在,如果您验证了自己的ID,则可以不断运行1个免费的dyno:https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours