如何简单地防止Heroku休眠?

337

在Heroku的免费应用程序中,动态资源似乎会保持空闲状态 - 我的应用程序流量非常低,但是对于我的用户需要等待20多秒才能启动新的动态资源来说,这也不是真正可接受的情况。

坦白地说,在那种等待时间下,许多人甚至会在第一页显示之前就离开。

所以,我有一个问题:当我的流量每天只有个位数时,我是否应该支付36美元/月来节省每个用户尴尬的长达20秒的等待时间呢?

有没有办法解决这个问题?


13
根据Heroku的声明,从2015年7月1日起将不再支持此功能:https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos。然而,他们推出了一种名为“爱好者”计划的服务,每月仅需支付7美元。 - Cristian
2
现在有许多虚拟服务器可用,每月仅需5美元(或按小时计费),提供完整的shell访问等功能。我已经使用DigitalOcean一年多了,但我相信还有其他竞争对手。如果Heroku不再免费,我认为这是一个更好的解决方案。 - sricks
2
@sricks 一个完整的VPS(需要您管理、更新、配置Git服务器、Web服务器、DB服务器、防火墙、Git钩子、备份、WAL-E等等)与Heroku(一种PaaS)是不同的东西。在某些情况下,您需要前者,在其他情况下,您需要后者,但原始资金应该是主要指标。时间和风险也应该考虑进去。 - elithrar
如何在 RoR 应用程序上安装 New Relic 代理?http://newrelic.com/ruby - James Brown
3
截至2016年6月1日,如果您使用信用卡进行验证,这将再次成为可能。[公告](https://devcenter.heroku.com/changelog-items/907)您将获得每月1000小时的免费使用时间,但一个月只有730小时。假设您只运行一个动态网络范本,那么您可以免费全天候使用。 - Luke B
24个回答

378
您可以安装免费的New Relic插件。它具有可用性监视功能,每分钟会向您的站点发送两个ping,从而防止dyno闲置。

与Jesse提出的解决方案基本相同,但可能更加集成到Heroku中...并带有一些额外好处(性能监视非常棒)。

可用性监视

注意:对于所有声称它无法工作的人,请注意我回答中的重要部分是“可用性监视”。仅安装插件是没有用的。 您还需要使用您的heroku应用程序的URL设置可用性监视。


7
为了防止 Dyno 休眠,我们是否需要安装 gem 'newrelic_rpm'? - simo
4
这会增加多少动力测试使用量? - Trevoke
4
我最近刚刚发现这个。它仍然非常有效。但以防万一,我确保在显示“应用程序可用”消息之前进行简单的数据库查询。 这也可以与Pagoda和任何其他睡眠主机很好地配合使用。 - Violet Shreve
8
@aubraus:你的编辑被拒绝了……无论如何,对于所有声称这不起作用的人,我答案中的重要部分是“可用性监视器”。仅仅安装插件是不够的。你还需要使用你的Heroku应用程序的URL来设置可用性监控。 - Pierre
18
如果有人仍在寻找此信息,ping 的直接链接在这里:https://synthetics.newrelic.com/accounts/[你的账户ID]/monitors/new只需替换您的账户ID即可。 - Eric Yang
显示剩余9条评论

110

你也可以尝试http://kaffeine.herokuapp.com(由我开发),它旨在防止Heroku应用进入睡眠状态。它将每10分钟PING您的应用程序,以使其不会进入睡眠状态。 完全免费。


6
可以将您的herokuapp从您的服务中移除吗? - meteor
2
我的矿机有时会闲置很久(有时甚至超过30分钟才会响应),但Heroku的闲置时间表也不稳定,所以现在我要试试新的Relic。 - JBW
我的仍然空闲。 - Shivang Kakkar
没有提供https的功能。你能修复吗? - rickb

104

作为Pingdom的替代方案,我建议尝试Uptimerobot。它是免费的,并提供5分钟间隔的站点检查。对我来说它运行得非常好。

更新于2015年5月7日:这将不再可能,因为Heroku将更改其免费dyno以防止其完全运行24小时:

另一个重要变化涉及dyno睡眠或“空闲”。虽然非付费应用程序在活动超时后总是会进入睡眠状态,但一些应用程序使用自动ping服务来防止该行为。免费dynos每24小时允许保持18小时清醒,并且在接下来的几周中,我们将开始通知超过此限制的应用程序用户。随着爱好dyno(每月7美元)的推出,我们要求您让您的应用程序在超时后休眠,或升级到这个新选项。

这将何时生效?根据他们的博客文章:

单个1X dyno运行的应用程序如果没有累积任何其他 dyno费用,将逐渐迁移到新的免费dynos 开始于7月1日


1
Uptimerobot似乎(具有讽刺意味地)已经宕机了。您可以注册并登录,但如果尝试添加新的监控器,则只会显示“监控器已存在”。 - Jeff Axelrod
似乎工作得相当不错...我知道Heroku在免费服务上会让事情睡眠,但是当托管中央协调器(其本质上无法扩展)时,这很糟糕。 - jonasfj
我无法做到这一点,因为Uptimerobot需要一个IP地址?我不知道如何使用URL(如Herokuapp URL)使其工作。 编辑: 我的错,我输入了“http://”并收到错误提示。 - Ruben Martinez Jr.
新的质量监测工具每30秒进行一次ping,但我听说它是建立在Uptimerobot之上,后者每5分钟进行一次ping。您知道这些时间间隔产生的差异吗? - max pleaner
1
最大的区别在于5分钟间隔意味着如果它宕机,您将在5分钟后收到通知。我们使用Pingometer(http://pingometer.com),其间隔为1分钟,并且与Heroku配合得非常好。 - okoboko
13
截至2017年4月,18小时限制已经取消,只要您的账户已验证,您可以让您的免费dyno全天候运行24/7。https://devcenter-staging.heroku.com/articles/free-dyno-hour-faq。 - bagonyi

81

我认为,在生产或面向客户的应用中,不应该使用服务的“免费”层。虽然上述解决方案可以防止Dyno停机,但要深思熟虑你正在做什么。

如果没有其他选择,请使用cron job定时访问您的网站,并在已知低使用期间(即过夜)禁用Heroku的检查,以确保不会影响其他用户的免费层。


1
谢谢你的回答。你所说的“认真考虑你正在做的事情”具体是什么意思? - sscirrus
38
主要是为那些阅读上述答案的人提供解决方案。Heroku免费层的目标不是托管需要对客户可用的生产应用程序。免费层空闲使得Heroku可以提供这个开发/测试级别,而无需大量运行服务器的高额成本。 - drowe
32
如果一个网站的流量不高,没有付费客户,而且你不想等待30秒才能加载第一页,那么它也可以作为一个“生产”网站。请注意,这里的“生产”指的是实际运营的网站。 - alxndr
2
你说得没错,但只运行一个 dyno 也有很多合理的原因... 比如只需要一个带有一些内存状态的协调器... - jonasfj
17
考虑到你对他的应用程序了解不多,我认为你的评论有些刻薄。 - wobbily_col

45
你可以使用 http://pingdom.com/ 检查你的应用程序;如果每分钟进行一次检查,Heroku 将不会使你的应用程序处于空闲状态,也不需要重新启动。

2
两个答案之间很难决定!最终我选择了Newrelic,因为我已经在那里有一个账户。非常感谢这个好建议 - 它确实解决了我的问题。 :) +1. - sscirrus
2
为什么每分钟都要这样做?正如@newe1344的回答中所述,Heroku在一小时不活动后会关闭dyno。因此,每59分钟ping一次肯定更有效率? - Darwin Tech
3
它会在宕机时发出报告,因此以分钟为单位的频率可以很好地防止睡眠并报告停机时间。 - Jesse Wolgamott
我不认为它(还)是免费的。 - rahulserver
@rahulserver - 你说得对,Pingdom不再提供免费账户了。 - John Lehmann

45

简单的答案——如果你重视这项服务,那就付费使用。

所有这些“诀窍”来获得付费服务的好处……那基本上就像是窃取有线电视一样。甚至在这里列出它们都有问题。接下来,是关于如何盗版游戏的技巧吗?

和另一个帖子的作者一样,我很重视用于开发和测试的免费服务,如果Heroku因为有太多的免费乘客而取消了这项服务,我会非常恼火,而且我认为他的批评不够直接。


23
这是一个付费服务,并且有一些特定条件。为什么不在这些条件内优化您的服务使用,以最大程度地发挥其作用呢? - pkinsky
8
我相信我已经提到了原因,但是为了更加明确--免费托管的预期用途很清楚。而“始终开启”的优势即使只支付第二个工作人员的微不足道的费用也是一个额外福利。这里的所有漏洞都涉及无用地消耗资源以逃避支付服务费用。这是可耻的行为。为什么我要关心呢?因为如果他们受够了,他们的应对措施将是取消免费服务,而这种服务如果按照预期使用可以为我带来极大的价值。 - elc
2
好的,为了澄清那些匆忙投反对票的人,他不仅问“有没有绕过它的方法?”还问“我应该支付...”这就是我要回答的问题。这是更基本的问题。当然,有很多微不足道的简单方法可以绕过去。它们在伦理上是错误的,因此在这里详细说明它们最多是浪费时间,而且可以说是更糟糕的,因为它构成了促进和鼓励不良行为。 - elc
5
有些过分了。我们在测试时部署到Heroku。当我们的客户在网站空闲一段时间后访问它时,他们会认为我们开发的连接服务的应用程序出了问题。为了演示可能永远不会面世的应用程序而保持网站的活动状态,这并不是不道德的行为。听起来像是个人信念,而不是伦理问题。如果没有违反规定或法律,你的道德假设就是错误的。Freemium 是一种合法的商业模式。利用其中的免费部分是可以的,这是预期的。 - Matt Long
1
所以你的辩解是“其他人都在做”,这并不是一个新的论点,也不是令人信服的。[编辑]对不起,你确实提出了一个对某些人有价值的观点。即正在做的事情没有明确禁止,因此它并不是错误的。我知道有人相信“没有明确禁止的事情是被允许的”,甚至更进一步地说它不仅被允许而且“不是错的”。整个态度就是我会用“过分自私”的方式来标签化的。但这确实归结为一种根本的哲学差异。 - elc
显示剩余6条评论

36

在2013年6月28日,我使用Node.js 0.10.x测试并成功运行在我的Heroku应用上

var http = require('http'); //importing http

function startKeepAlive() {
    setInterval(function() {
        var options = {
            host: 'your_app_name.herokuapp.com',
            port: 80,
            path: '/'
        };
        http.get(options, function(res) {
            res.on('data', function(chunk) {
                try {
                    // optional logging... disable after it's working
                    console.log("HEROKU RESPONSE: " + chunk);
                } catch (err) {
                    console.log(err.message);
                }
            });
        }).on('error', function(err) {
            console.log("Error: " + err.message);
        });
    }, 20 * 60 * 1000); // load every 20 minutes
}

startKeepAlive();

3
在我看来,最好的解决方案是不依赖于任何第三方服务。谢谢 :) - electronix384128
似乎它并没有避免进入睡眠状态。但是它可以自动重新启动。我不知道这种行为是否是由于更改引起的,实际上你的解决方案来自将近两年前。 - jgato

30

我使用由Heroku提供的免费Heroku Scheduler插件。一旦添加,只需使用“curl http://yourapp.herokuapp.com”创建一个10分钟的任务即可。


我认为这是目前最简单的解决方案,谢谢 @Jordan - fredy kardian
2
唯一的缺点是,在提供此附加组件之前,他们要求提供信用卡信息。 - prgmrDev

21
请将您的应用程序网址添加到http://kaffeine.herokuapp.com/

来自该网站:

Kaffeine每30分钟向您的Heroku应用程序发送ping,因此它永远不会进入睡眠状态*

Kaffeine每30分钟向您的Heroku应用程序发送ping,因此它永远不会进入睡眠状态


没有提供https的选项。 - rickb

11

在Heroku的文档中表示,拥有超过1个Web dyno将永远不会处于空闲状态。这可能是比Pierre建议的每小时$0.09更便宜的解决方案。

输入图像描述

文档


6
Heroku的附加组件有一个免费的标准版。 - sscirrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接