Herokuのアイドリングを防ぐ簡単な方法は?


285

Herokuの無料アプリでは、dynoがアイドリングを続けているようです。私のアプリのトラフィックは非常に少ないですが、ユーザーが新しいdynoを起動するために20秒以上待たなければならない場合も、許容できません。

率直に言って、そのような待ち時間があると、最初のページが表示される前に多くの人が去ります。

したがって、問題があります。トラフィックが1日1桁の場合、各ユーザーに20秒間という厄介なほど長い時間を節約するために、月額36ドルを払う必要があります。

これを回避する方法はありますか?


13
Herokuの発表によると、2015年7月1日以降、これは不可能になります:blog.heroku.com/archives/2015/5/7/heroku-free-dynos。しかし、彼らは月額わずか7ドルの「趣味」プランを導入しました。
クリスティアン

1
フルシェルアクセスなどを提供する仮想サーバーが月額5ドル(または1時間あたりの請求額)で利用できるようになった可能性があります。DigitalOceanを1年以上使用してきましたが、他にも競合する分野があるはずです。Herokuが無料でなくなった場合、IMOはより良いソリューションです
。–

1
@sricksフルVPS(管理、更新の維持、Gitサーバー、Webサーバー、DBサーバー、ファイアウォール、Gitフック、バックアップ、WAL-Eなどの構成が必要)は、Herokuとは異なります( PaaS)。前者が必要な場合もあれば、後者が必要な場合もありますが、生のドルが主要な指標になります。時間とリスクがあるべきです。
elithrar 2015年

New RelicエージェントをRoRアプリにインストールする方法は?newrelic.com/ruby
Manny Quintanilla

1
2016年6月1日以降、クレジットカードで確認すれば、これは可能です。発表。月に1000時間の無料時間が得られ、月に730時間しかありません。dynoが1つだけ実行されていると仮定すると、24時間365日無料で参加できます。
ベイクドポテト

回答:


351

無料のNew Relicアドオンをインストールできます。これには、1分に2回サイトにpingする可用性モニター機能があり、dynoがアイドル状態になるのを防ぎます。

Jesseとほぼ同じソリューションですが、Herokuに統合されている可能性があります...そして、いくつかの特典があります(パフォーマンスモニタリングは優れています)。

可用性の監視

注:それが機能しないと言っているすべての人に:私の答えの重要な部分は「可用性モニター」です。アドオンをインストールするだけでは役に立ちません。また、herokuアプリのURLを使用して可用性監視を設定する必要があります。


6
dynoがアイドリングしないようにするには、gem 'newrelic_rpm'もインストールする必要がありますか?
simo

3
これにより、dynoの使用量はどの程度増加しますか?
2012年

4
最近これを発見しました。それまだうまく働きます。ただし念のため、「Application Available」メッセージを表示する前に、簡単なDBクエリを実行するようにしています。これはPagodaやその他の眠いホストでもうまく機能します。
Jacob Evan Shreve 2013年

8
@aubraus:あなたの編集は拒否されました...とにかく:それが機能しないと言っているすべての人に:私の答えの重要な部分は「可用性モニター」です。アドオンをインストールするだけでは役に立ちません。また、herokuアプリのURLを使用して可用性監視を設定する必要があります。
ピエール

13
場合には誰もが、まだこのを探している、pingのための直接リンクはこちらです:synthetics.newrelic.com/accounts/[your_account_id]/monitors/new アカウントID内だけでサブ。
エリックヤン

91

Pingdomの代わりに、Uptimerobotを試すことをお勧めします。これは無料で、5分の間隔でサイトをチェックできます。私にとっては非常にうまくいきます。

2015年5月7日更新:Herokuは 24時間フル稼働しないように無料のdyno変更するため、これはもう不可能です。

もう1つの重要な変更は、dyno睡眠、または「アイドル」に関係しています。有料アプリは常にアクティビティのタイムアウト後にスリープしていましたが、一部のアプリは自動pingサービスを使用してその動作を防止しました。無料のdynoは24時間ごとに18時間起きることが許可されており、今後数週間で、その制限を超えるアプリをユーザーに通知し始めます。hobby dyno(月額7ドル)の導入に伴い、タイムアウト後にアプリをスリープさせるか、この新しいオプションにアップグレードするように求めています。

これはいつライブになるのですか?彼らのブログ投稿によると:

1つの1X dynoを実行していて、他のdyno料金を累積しないアプリケーションは、7月1日から新しい無料のdynoに徐々に移行されます。


1
Uptimerobotは(皮肉にも)ダウンしているようです。サインアップしてログインできますが、新しいモニターを追加しようとすると、「モニターはすでに
Jeff Axelrod

かなりうまく機能しているようです... herokuは無料のサービスで物事をスリープ状態にすることを理解していますが、中央のコーディネーター(naturではスケーリングできません)をホストする場合は問題があります。
jonasfj 2014

UptimerobotにはIPアドレスが必要なため、これを行うことができませんでしたか?herokuappのURLなど、URLを使用する方法がわかりません。編集:私の悪い、私は入れhttp://てエラーを得ました。
ルーベンマルティネスJr.

1
大きな違いは5分の間隔で、ダウンした場合に通知を受けるまでに5分かかります。1分間隔のPingometer(pingometer.com)を使用しており、Herokuで優れています。
okoboko 2014年

9
2017年4月の時点で、18時間の制限がなくなり、アカウントが確認されれば、無料のdynoを24時間年中無休で利用できます。devcenter-staging.heroku.com/articles/free-dyno-hour-faq
bagonyi

76

私の意見では、サービスの「無料」層を使用することは、本番アプリケーションや顧客向けアプリケーションを強化するものではありません。上記の解決策はDynoのアイドリングに対して有効ですが、何をしているのかを十分に考えてください。

他に何もない場合は、cronジョブを使用してサイトにpingを送信し、既知の低使用期間(つまり、夜間)のチェックを無効にして、Herokuが他のすべてのユーザーの無料枠を排除しないようにします。


ご回答有難うございます。「自分のやっていることを徹底的に考える」とはどういう意味ですか?
sscirrus 2012年

36
主に、このソリューションの上記の回答を読んだ人向けです。Herokuの無料枠の目標は、顧客が利用できるようにする必要がある本番環境アプリをホストすることではありません。無料利用枠のアイドリングにより、Herokuは、継続的にサーバーを実行することによる大きなオーバーヘッドコストなしに、このレベルの開発/テストを提供できます。
溺れる

29
トラフィックが少なく、有料の顧客がいない「本番」サイトでも問題ありません。最初のページが読み込まれるまで30秒待つ必要はありません。
alxndr 2013年

2
あなたは正しいですが、1つのdynoを実行するのには多くの正当な理由があります...メモリにいくつかの状態を持つ単一のコーディネーターがあるなど...
jonasfj

17
あなたは彼のアプリについてあまり知らないので、あなたのコメントはかなり判断に値すると思います。
wobbily_col 14

60

また、http://kaffeine.herokuapp.com(私が作成)を試すこともできます。これは、Herokuアプリがスリープ状態にならないようにするために作成されています。アプリは10分ごとにpingするため、アプリはスリープ状態になりません。それは完全に無料です。


1
herokuappをサービスから削除することは可能ですか?
流星

2
新しいアプリを受け付けなくなりました。そのGitHubページには、それに関するいくつかの問題が含まれています。この回答は現在廃止されていると見なすことができます。
nickolay.laptev

45

アプリをチェックするにはhttp://pingdom.com/を使用できます。毎分程度の場合、herokuはアプリをアイドル状態にすることはなく、スピンアップする必要もありません。


2
2つの答えの間で決定するのはとても難しいです!結局、すでにアカウントを持っているので、Newrelicを使いました。この素晴らしい提案に感謝します-実際に私の問題も解決しました。:) +1。
sscirrus

2
なぜそれは毎分ですか?@ newe1344の回答を見るとわかるように、Herokuは1時間操作がないとdynoをスピンダウンします。確かに59分ごとにピン留めする方が効率的ですか?
Darwin Tech

2
それはダウンしたときに報告するので、分の頻度は睡眠の防止とダウンタイムの報告の両方に
適しています

私は(まだ?)無料だとは思いません。
rahulserver 2014

@rahulserver-正解です。Pingdomには無料のアカウントがありません。
John Lehmann

40

簡単な答え-サービスを重視する場合は、料金を支払います。

有料サービスのメリットを得るためのこれらすべての「トリック」...まあ、それは基本的にケーブルを盗むようなものです。ここにそれらをリストすることさえ疑わしい。次は何ですか、ゲームを海賊版する方法のトリック?

ここの他のポスターのように、私は開発とテストのための無料サービスを評価します。そして、Herokuがフリーローダーが多すぎるためにそれを排除した場合、私はあなたのすべての倫理障害タイプに大いに悩まされます。私は彼が彼の批判を十分に率直であったとは思いません。


14
これは、一定の条件付きの有料サービスです。これらの条件内でサービスの使用を最適化して、最大限に活用してみませんか?
pkinsky 2014

8
さて、私はすでに理由を示したと思いますが、もう少し詳しく説明すると、無料ホスティングの使用目的は明らかです。そして、「常にオン」の利点は、2人目の労働者にわずかな費用でも支払うという特典です。ここでのすべてのエクスプロイトは、サービスの支払いから抜け出すために無駄にリソースを消費することを伴います。恥ずかしい振る舞いです。なぜ気にする必要がありますか?彼らがうんざりしたら、彼らの頼みは、意図されたように使用された、私にとって非常に価値のある無料のサービスを廃止することです。
elc

2
ドライブバイダウンの投票者を明確にするためだけに、彼は「それを回避する方法はありますか?」と尋ねるだけではありません。彼はまた、「支払わなければなりませんか?」と尋ねます。それはより根本的な問題です。もちろん、バイパスするための簡単な方法はたくさんあります。それらは倫理的に間違っているので、ここでそれらを詳述することはせいぜい時間の無駄であり、おそらくそれが悪い振る舞いを可能にし、励ますことを構成するので、かなりかなり悪いです。
elc

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
私の見解では、サードパーティのサービスに依存していないため、最良のソリューションです。ありがとう:)
electronix384128 14

寝るのを避けられないようです。しかし、それは自動的に再び上がるように働きます。この動作が変更によるものかどうかはわかりませんが、実際の解決策はほぼ2年前のものです。
jgato 2015


11

Herokuのドキュメントでは、複数のWeb dynoがあっても決してアイドル状態になることはないとしています。おそらく、Pierreが提案するように、1時間あたり0.09ドルよりも安価なソリューションです。

ここに画像の説明を入力してください

ドキュメンテーション


6
Herokuアドオンには無料の標準バージョンがあります。
sscirrus 2013

9

手順を書き留めました。

gステージングと本番環境でGemfileにgem 'newrelic_rpm'を追加します
➜バンドルインストール
her herokuコントロールパネルにログインしてnewrelicアドオンを
追加しますadded追加したら、アイドル状態にならないようにWebサイトへの自動pingをセットアップします
Menuメニューに移動>可用性の監視( [設定]の下で)→[可用性監視をオンにする]をクリック
しますpingするURLを入力します(例:http : //spokenvote.org
the間隔として1分を選択します


3
Pratikに感謝します。ちなみに、毎分アプリにpingを送信すると、アイドリングすることなく、帯域幅を使い果たしてしまいます。別の理由がない限り、タッチをスケールバックしても安全です。
sscirrus 2013年

提案をありがとう@sscirrus
Pratik Khadloya 2013年

3
Herokuは、1時間非アクティブになった後にのみdynoをスリープ状態にするため、間隔を1時間(または安全のためにおそらく50分)に戻すことができます。
David Underwood

質問:pingの間隔をどこで変更すればいいのですか。ダッシュボードの設定では利用できないオプションのようです。
mishap_n 2014


3

新しいdynoタイプ(現在ベータ版、2015年6月にリリース)では、1日あたり少なくとも6時間はスリープ状態にする必要があるため、24時間年中無休で無料のdynoを起こし続けることはできません。

そのため、このスレッドで見つかったすべてのソリューションを削除する前に、削除するようにしてください(または実際に使用するサービスの料金を支払います)。


3

常に稼働しているUNIXサーバーにアクセスできる場合はGET、Webサイトにcronジョブを設定できます。無料プランの新しい条件の下では、おそらく次のGETようなcrontabの行を使用して、夜間にを無効にする必要があります。

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

これは、8時から22時までの間、20分ごとcurlGETdomain.comに指示します。

を注意

  1. あなたのウェブサイトを見たい人全員があなたのタイムゾーンに住んでいるわけではなく、
  2. あなたのサイトは深夜に他のリクエストを受け取り、dynoを起こし、リクエストごとにさらに1時間の使用時間を発生させる可能性があります。ドメインを誰も知らない場合でも、常にアクティブなボットとクローラーがあります。したがって、これらのウェイクアップに対するバッファーを提供するために、crontabで定義されているプロセスを14〜16時間だけアクティブにするように設定することをお勧めします。

また、システム時間が適切に設定されていることを確認して、予想どおりにダウンタイムウィンドウが発生するようにしてください。


3

ここでの回答のほとんどは古くなっているか、現在機能していません。個人アカウントの現在の無料枠は、毎月 550時間の無料dyno時間を提供します。

確認済みの無料アカウントでは、1000時間の無料dynoが提供されます。無料アプリをいつまでも目覚めさせ続ける方法についての記事を書きました。

https://link.medium.com/uDHrk5HAD0

2019年にソリューションを必要としているすべての人に役立つことを願っています


2

これは私にとって春のアプリケーションで2分ごとにルートURLパスに1つの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
});

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.