防止Heroku空转的简便方法?


285

在Heroku免费应用程序中,测功机似乎一直处于闲置状态-我的应用程序的流量非常低,但在我的情况下,我的用户必须等待20秒钟以上才能启动新的测功机,这也不能令人满意。

坦白说,经过这样的等待,许多人甚至在首页显示之前就离开了。

因此,我有一个问题:当我的流量每天达到一位数字时,我应该每月支付36美元来为每个用户节省20秒钟的尴尬时间吗。

有没有解决的办法??


13
根据Heroku的公告:blog.heroku.com/archives/2015/5/7/heroku-free-dynos,从2015年7月1日起,将不再可能。但是,他们推出了一项“业余爱好”计划,每月只需花费7美元。
克里斯蒂安

1
现在可能有虚拟服务器可用,价格为每月5美元(或按小时计费),可以提供完全的外壳访问等。我已经使用DigitalOcean一年多了,但是我敢肯定还有其他竞争空间。IMO一个更好的解决方案,如果Heroku的不再免费..
sricks

1
@sricks完整的VPS(您需要管理,保持更新,配置Git服务器,Web服务器,DB服务器,防火墙,Git钩子,备份,WAL-E等,等等)与Heroku( PaaS)。在某些情况下,您希望使用前者,而在另一些情况下,则需要原始货币,这是主要指标。时间和风险应该是。
elithrar 2015年

如何在RoR应用程序上安装New Relic代理?newrelic.com/ruby
Manny Quintanilla

1
自2016年6月1日起,如果您使用信用卡验证,则可以再次使用。公告。您每月将获得1000个免费小时,一个月中只有730小时。假设您仅运行一个测功机,则可以免费使用24/7。
烤土豆

Answers:


351

您可以安装免费的New Relic附加组件。它具有可用性监视器功能,它将每分钟对您的站点执行一次ping操作,从而防止dyno空转。

与Jesse大致相同的解决方案,但可能更多地集成到了Heroku中……而且还有一些好处(性能监控非常棒)。

可用性监控

注意:所有人都认为这是行不通的:我回答的重要部分是“可用性监视器”。仅安装插件将无济于事。您还需要使用heroku应用程序的URL设置可用性监视。


6
我们还必须安装gem'newrelic_rpm'来防止dyno空转吗?
simo 2012年

3
这会增加多少测功机使用量?
跋涉2012年

4
我是最近才发现的。它确实还是很好地工作。不过,以防万一,在显示“ Application Available”消息之前,请确保执行简单的数据库查询。这也适用于宝塔和任何其他昏昏欲睡的主机。
Jacob Evan Shreve

8
@aubraus:您的编辑被拒绝了...无论如何:对于所有说不起作用的人:我的回答中重要的部分是“可用性监视器”。仅安装插件将无济于事。您还需要使用heroku应用程序的URL设置可用性监视。
皮埃尔

13
如果仍然有人在寻找它,可以在此处直接进行ping的链接:synthesis.newrelic.com/accounts/ [ your_account_id] / monitors / new您帐户ID中的Just子项。
Eric Yang

91

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

2015年5月7日更新:这将不再可能,因为Heroku会更改其免费测功机,以使其保持24小时不间断运行:

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

这什么时候上线?根据他们的博客文章:

7月1日开始,运行一次1X测功的应用程序将逐渐迁移到新的免费测功上。


1
Uptimerobot似乎(具有讽刺意味的)失败了。您可以注册并登录,但是如果您尝试添加新的监视器,它只会显示“已经存在监视器
Jeff Axelrod

似乎可以正常工作,很好...我知道heroku依靠免费服务来睡觉,但是在托管中央协调器时就糟透了(natur无法缩放)。
jonasfj 2014年

由于Uptimerobot需要IP地址,我无法执行此操作?我看不到如何使用它来处理网址,例如herokuapp网址。编辑:我不好,我正在插入http://并得到一个错误。
鲁宾·马丁内斯(Ruben Martinez)2014年

1
最大的不同是5分钟的间隔,这意味着您需要等待5分钟才能知道它的状态。我们使用间隔1分钟的Pingometer(pingometer.com),对于Heroku来说效果很好。
okoboko 2014年

9
自2017年4月起,这18小时的限制已不复存在,只要您的帐户已通过验证,您就可以24/7进行免费的动态测功。devcenter-staging.heroku.com/articles/free-dyno-hour-faq
bagonyi

75

我认为,使用“免费”服务层不应为生产或面向客户的应用程序提供动力。尽管上述解决方案可防止Dyno空转,但请仔细考虑您的工作。

如果没有其他要求,请使用cron作业对您的网站执行ping操作,并在已知的低使用期限(即整夜)中禁用检查,以确保Heroku不会为其他所有人取消免费套餐。


感谢您的回答。“彻底考虑自己在做什么”的具体含义是什么?
sscirrus

35
主要针对阅读上述解决方案答案的人们。Heroku上的免费套餐的目标不是托管需要供客户使用的生产应用程序。免费的层级空闲使Heroku可以提供此级别的开发/测试,而无需持续运行服务器而产生大量开销。
drowe 2012年

29
对于流量低且没有付费客户的“生产”网站也很合适,您不想等待三十秒钟来加载第一页。
alxndr

2
您是正确的,但是有一个仅运行一个测功机的正当理由有很多……例如,在内存中只有一个具有某些状态的协调器……
jonasfj 2014年

17
您对他的应用不太了解,因此我认为您的评论相当有判断性。
wobbily_col 2014年

60

您也可以尝试http://kaffeine.herokuapp.com(由我制造),它是为防止Heroku应用程序进入睡眠状态而设计的。它将每隔10分钟对您的应用执行ping操作,以使您的应用不会进入睡眠状态。它是完全免费的。


1
是否可以从服务中删除herokuapp?
流星

2
它不再接受新的应用程序。它的GitHub页面包含与此有关的几个问题。这个答案现在可以认为已经过时了。
nickolay.laptev

45

您可以使用http://pingdom.com/查看您的应用;如果每分钟左右完成一次,heroku不会闲置您的应用程序,也不需要加速。


2
很难在两个答案之间做出选择!最后,我选择了Newrelic,因为我已经在那里拥有了一个帐户。非常感谢这个很棒的建议-它确实也解决了我的问题。:) +1。
sscirrus 2011年

2
为什么每分钟这样做?如您在@ newe1344的答案中所见,Heroku在一个小时的不活动状态后降低了dyno。那么确定每59分钟固定一次会更有效吗?
达尔文技术公司

2
它会报告停机时间,因此分钟频率可以很好地防止睡眠和报告停机时间
Jesse Wolgamott

我不认为它(还是?)是免费的。
rahulserver

@rahulserver-您是正确的,Pingdom不再有免费帐户。
约翰·莱曼

40

简单的答案-如果您重视服务,然后付费。

所有这些“技巧”都是为了获得付费服务的好处……嗯,这本质上就像是在偷电缆。甚至在这里列出它们都值得怀疑。接下来,如何盗版游戏的技巧?

就像这里的另一张海报一样,我非常重视免费的开发和测试服务,如果Heroku放弃了它,因为有太多的免费下载程序,那么我将非常烦恼你们所有道德受损的类型。我只是认为他的批评不够直接。


14
这是一项付费服务​​,带有某些条款。为什么不按这些条款优化您对服务的使用,以充分利用服务呢?
pkinsky 2014年

8
好吧,我相信我已经指出了原因,但是要进一步说明-免费托管的预期用途很明确。而且,“永远在线”的优势在于即使付第二工人的微薄费用也很容易。这里的所有攻击都涉及无用的消耗资源,从而摆脱了为服务付费的麻烦。这是可耻的行为。我为什么要在乎?因为如果他们受够了,他们的诉求将是取消免费的服务,按预期使用该服务对我来说非常有价值。
elc

2
好吧,只是为您澄清开车的低潮者,他不仅问“有没有解决的办法?” 他还问:“我应该付款吗?”这就是我的答复。这是更根本的问题。当然,有很多简单的方法可以绕开。从道德上讲,它们是错误的,因此,在这里详细说明它们最多是浪费时间,并且可以说是更糟的情况,因为它构成了鼓励和鼓励不良行为的能力。
elc 2014年

4
有点过分了。我们在测试时部署到heroku。当我们的客户闲置时访问该站点时,他们会认为我们开发的连接到该服务的应用程序存在问题。为了响应迅速地演示可能永远不会出现的应用程序而使站点保持活动状态几乎是不道德的。听起来像是个人的信念,而不是道德。如果它没有违反规则或法律,那么唯一的错误就是道德上的推定。免费增值是一种合法的商业模式。可以“利用”其中的自由部分。可以预料的
马特·朗

1
因此,您的辩解是“其他人都在这样做”,这并不是一个新的论点。还是令人信服的。 编辑抱歉,您的观点对某些人有效。没有明确禁止正在执行的操作,因此没有错。我知道有些人相信“没有明确禁止的内容是允许的”,并且进一步说这不仅是允许的,而且是“没有错的”。我会以一种非常自我服务的方式来形容这种过度态度。但这确实归结为根本的哲学差异。
elc

30

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

2
我认为最好的解决方案是,它不依赖任何第三方服务。谢谢:)
electronicix384128

看来这并不能避免睡觉。但是它可以自动再次上升。我不知道这种行为是否是由于更改引起的,实际上您的解决方案来自大约两年前。
jgato 2015年


11

它在Heroku文档中说,拥有超过1个Web dyno永远不会闲着。像Pierre所建议的那样,这可能是一个比$ 0.09 /小时更便宜的解决方案。

在此处输入图片说明

文献资料


6
Heroku附加组件具有免费的标准版本。
sscirrus

9

我写下了步骤:

st在登台和生产下将gem'newrelic_rpm'添加到您的Gemfile中
➜捆绑安装
➜登录heroku控制面板并添加newrelic插件
➜添加后,将自动ping设置到您的网站,以使其不会闲置
➜浏览到菜单>可用性监控(在设置下)→单击“打开可用性监控”
➜输入要ping的网址(例如:http : //spokenvote.org
➜选择1分钟作为间隔


3
感谢Pratik。仅供参考,如果您每分钟对应用程序执行一次ping操作,则会耗尽带宽,而对空闲却没有任何好处。除非您有其他原因,否则可以安全地进行扩展。
sscirrus,

感谢您的建议@sscirrus
Pratik Khadloya

3
Heroku只会在1小时不活动之后使您的dyno进入睡眠状态,因此您可以将时间间隔缩短回1小时(为了安全起见,可能需要50分钟)。
大卫·安德伍德

问题:您碰巧知道在哪里更改该ping间隔吗?它似乎不是仪表板设置中的可用选项。
mishap_n 2014年


3

请注意,新的测功机类型(目前处于测试版,将于2015年6月推出)将禁止保持24/7唤醒的免费测功机,因为它每天必须至少睡6个小时。

因此,请尝试在此线程出现之前删除在该线程中找到的所有解决方案(或支付您实际使用的服务的费用)。


3

如果您可以访问始终打开的Unix服务器,则可以将cron作业设置为GET您的网站。根据免费计划的新条款,您可能希望GET在夜间使用crontab中的一行禁用s,如下所示:

*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null

这指示在8点到22点之间每20分钟curl访问GET一次domain.com。

意识到

  1. 并非每个想要查看您网站的人都生活在您所在的时区,
  2. 您的站点可能会在深夜收到其他请求,从而唤醒您的dyno,并导致每个请求的使用时间增加一小时。即使没有人知道您的域,也有始终处于活动状态的漫游器和爬虫。因此,建议将crontab中定义的进程设置为仅活动14到16个小时,以便为这些唤醒提供缓冲

另外,请确保正确设置系统时间,以使停机时间窗口在您期望的时间发生。


3

这里的大多数答案已经过时或目前无法正常工作。当前的个人帐户免费套餐每月提供550个免费动态小时基础

一个经过验证的免费帐户可为您提供1000个小时的免费测功机。我写了一篇有关如何使我的免费应用保持清醒状态的文章。

https://link.medium.com/uDHrk5HAD0

希望它可以帮助2019年需要解决方案的任何人


2

这在春季应用程序中为我工作,每2分钟向根url路径发出一个http请求

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.client.RestTemplate;

public class HerokuNotIdle {

private static final Logger LOG = LoggerFactory.getLogger(HerokuNotIdle.class);

@Scheduled(fixedDelay=120000)
public void herokuNotIdle(){
    LOG.debug("Heroku not idle execution");
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getForObject("http://yourapp.herokuapp.com/", Object.class);
}
}

记住配置上下文以启用调度程序并为调度程序创建bean

@EnableScheduling
public class AppConfig {

@Bean
public HerokuNotIdle herokuNotIdle(){
    return new HerokuNotIdle();
}
}


1

我有一个只需要在周一至周五午餐时间运行的应用程序。我只是在工作中将以下脚本添加到crontab中:

#!/bin/sh
# script to unidle heroku installation for the use with cronjob
# usage in crontab:
# */5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com
# The command /usr/local/bin/uptimer.sh http://www.example.com will execute every 5th minute of 11am through 3pm Mondays through Fridays in every month.
# resources: http://www.cronchecker.net
echo url to unidle: $1
echo [UPTIMER]: waking up at:
date
curl $1
echo [UPTIMER]: awake at:
date

因此,对于任何应用程序,只需在crontab中添加另一行即可:

*/5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com

1

我认为最简单的解决方法是每30分钟自动ping您自己的服务器。这是我在node.js项目中用来防止睡眠的代码。

const request = require('request');
const ping = () => request('https://<my-app-name>.herokuapp.com/', (error, response, body) => {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log('body:', body); // Print body of response received
});
setInterval(ping, 20*60*1000); // I have set to 20 mins interval

1

另一个可行的解决方案:wokeDyno 这是一篇博客文章,其工作方式:非常容易地将其集成到应用程序中:

/* Example: as used with an Express app */

const express = require("express")
const wakeDyno = require("woke-dyno");

// create an Express app
const app = express();

// start the server, then call wokeDyno(url).start()
app.listen(PORT, () => {
    wakeDyno(DYNO_URL).start(); // DYNO_URL should be the url of your Heroku app
});

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.