헤 로쿠 공회전을 방지하는 쉬운 방법?


285

Heroku 무료 앱에서 dynos가 유휴 상태 인 것처럼 보입니다. 내 앱의 트래픽이 매우 적지 만 사용자가 새로운 dyno를 가동시키기 위해 20 초 이상 기다려야하는 경우도 있습니다.

솔직히 그런 종류의 대기로 많은 사람들이 첫 페이지가 표시되기 전에 떠날 것입니다.

따라서 문제가 있습니다. 트래픽이 하루 한 자리 수인 경우 각 사용자를 당황스럽게 20 초 동안 절약하기 위해 한 달에 36 달러를 지불해야합니다.

이 주위에 방법이 있습니까 ??


13
Heroku의 발표에 따르면 2015 년 7 월 1 일부터 더 이상 불가능할 것 입니다 ( blog.heroku.com/archives/2015/5/7/heroku-free-dynos) . 그러나 월 $ 7의 비용으로 "취미"계획을 도입했습니다.
Cristian

1
이제 전체 쉘 액세스 등을 제공하는 가상 서버가 매월 $ 5 (또는 시간당 청구되지 않음)로 제공 될 수 있습니다. 1 년 이상 DigitalOcean을 사용해 왔지만 경쟁 할 다른 서버가 있다고 확신합니다. IMO Heroku가 더 이상없는 경우 더 나은 솔루션 ...
sricks

1
@sricks 완전한 VPS (관리, 업데이트 유지, Git 서버, 웹 서버, DB 서버, 방화벽, Git 후크, 백업, WAL-E 등 등)는 Heroku와 다릅니다. PaaS). 어떤 경우에는 전자를 원하고 다른 것은 후자를 원하지만 원 달러는 1 차 메트릭이어야합니다. 시간과 위험이 있어야합니다.
elithrar

RoR 앱에 New Relic 에이전트를 설치하는 방법은 무엇입니까? newrelic.com/ruby
매니 퀸 타닐

1
2016 년 6 월 1 일부터 신용 카드로 확인하면 다시 가능합니다. 발표 . 한 달에 1000 시간의 무료 시간이 제공되며 한 달에 730 시간 만 있습니다. 하나의 dyno 만 실행한다고 가정하면 24 시간 연중 무휴 무료로 이용할 수 있습니다.
구운 감자

답변:


351

무료 New Relic 애드온을 설치할 수 있습니다 . 이 사이트에는 분당 2 회 사이트를 핑 (ping)하여 dyno가 유휴 상태가되지 않도록하는 가용성 모니터 기능이 있습니다.

Jesse와 거의 동일한 솔루션이지만 Heroku에 더 통합되었을 수도 있습니다.

가용성 모니터링

참고 : 작동하지 않는다고 말하는 모든 사람들에게 내 대답의 중요한 부분은 "가용성 모니터"입니다. 애드온을 설치하는 것만으로는 도움이되지 않습니다. 또한 heroku 앱의 URL을 사용하여 가용성 모니터링을 설정해야합니다.


6
dyno가 유휴 상태가되지 않도록 gem 'newrelic_rpm'도 설치해야합니까?
simo

3
이로 인해 dyno 사용량이 얼마나 증가합니까?
취소

4
방금 최근에 이것을 발견했습니다. 그것은 않습니다 여전히 훌륭하게 작동합니다. 다만, 'Application Available'메시지를 표시하기 전에 간단한 DB 쿼리를 수행해야합니다. 이것은 Pagoda 및 다른 졸린 호스트와도 잘 작동합니다.
Jacob Evan Shreve 2016 년

8
@aubraus : 편집이 거부되었습니다 ... 어쨌든 : 그것이 작동하지 않는다고 말하는 모든 사람들에게 : 내 대답의 중요한 부분은 "가용성 모니터"입니다. 애드온을 설치하는 것만으로는 도움이되지 않습니다. 또한 heroku 앱의 URL을 사용하여 가용성 모니터링을 설정해야합니다.
Pierre

13
경우 사람이 여전히이 찾고 년대에, 핑에 대한 직접 링크는 여기에 있습니다 : synthetics.newrelic.com/accounts/[your_account_id]/monitors/new 계정 ID에 그냥 서브.
Eric Yang

91

Pingdom의 대안으로 Uptimerobot을 사용해 보는 것이 좋습니다 . 무료이며 5 분 간격으로 사이트를 점검합니다. 그것은 나를 위해 아주 잘 작동합니다.

2015 년 5 월 7 일 업데이트 : Heroku는 24 시간 동안 완전히 유지되지 않도록 무료 dyno변경 하므로 더 이상 불가능합니다 .

또 다른 중요한 변화는 dyno 수면 또는 '유휴'와 관련이 있습니다. 무료 앱은 활동 시간이 만료 된 후 항상 잠을 잤지 만 일부 앱은 자동 핑 서비스를 사용하여 해당 동작을 방지했습니다. 무료 dyno는 24 시간마다 18 시간 씩 깨어날 수 있으며 앞으로 몇 주 동안 사용자에게 해당 제한을 초과하는 앱을 알리기 시작합니다. 취미 다이노 (매월 7 달러)가 도입됨에 따라 시간 초과 후 앱을 절전 모드로 전환하거나이 새로운 옵션으로 업그레이드 할 것을 요청하고 있습니다.

언제 생방송이 되나요? 그들의 블로그 게시물에 따르면 :

다른 dyno 요금이 누적되지 않는 단일 1X dyno를 실행하는 응용 프로그램은 7 월 1 일 부터 점차적으로 새로운 무료 dyno로 마이그레이션됩니다 .


1
업타임 로봇은 (아이러니 컬하게) 다운 된 것 같습니다. 가입하고 로그인 할 수 있지만 새 모니터를 추가하려고하면 "모니터가 이미 있습니다
Jeff Axelrod

공정하게 잘 작동하는 것 같습니다 ... heroku는 무료 서비스로 물건을 잠들지 않는다는 것을 이해하지만 중앙 조정자를 호스팅 할 때 짜증납니다.
jonasfj

Uptimerobot에 IP 주소가 필요하므로이 작업을 수행 할 수 없었습니다 ?? herokuapp URL과 같은 URL로 작동시키는 방법을 알 수 없습니다. 편집 : 내 나쁜, 나는 넣고 http://오류가 발생했습니다.
Ruben Martinez Jr.

1
가장 큰 차이점은 5 분 간격이며 다운 된 경우 5 분이 지나야 알림을받습니다. 우리 는 1 분 간격의 Pingometer ( pingometer.com )를 사용 하며 Heroku와 함께했습니다.
okoboko

9
2017 년 4 월 현재, 18 시간 제한이 만료되면 계정이 확인되면 24 시간 내내 무료 dyno를 이용할 수 있습니다. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

내 생각에, 서비스의 '무료'계층을 사용한다고해서 프로덕션 또는 고객 용 애플리케이션에 전원을 공급해서는 안됩니다. 위의 솔루션이 Dyno 유휴 상태에서 작동하지만 수행중인 작업에 대해 철저히 생각하십시오.

다른 방법이 없다면 cron 작업을 사용하여 사이트를 핑하고 Heroku가 다른 모든 사람의 프리 티어를 없애지 않도록 알려진 낮은 사용 기간 (즉, 야간) 검사를 비활성화하십시오.


답변 주셔서 감사합니다. '무엇을하고 있는지 철저히 생각하라'는 말의 의미는 무엇입니까?
sscirrus 2016 년

36
이 솔루션에 대한 위의 답변을 읽는 사람들에게 주로 사용됩니다. Heroku의 프리 티어 목표는 고객이 사용할 수있는 프로덕션 앱을 호스팅하는 것이 아닙니다. 프리 티어 아이들링을 통해 Heroku는 지속적으로 서버를 운영하는 데 드는 오버 헤드 비용없이 개발 / 테스트에이 수준을 제공 할 수 있습니다.
drowe 2016 년

29
트래픽이 적고 유료 고객이없는 "제작"사이트에도 좋습니다. 첫 페이지가로드 될 때까지 30 초를 기다리지 않습니다.
alxndr

2
당신은 맞지만, 하나의 다이노를 실행하는 데에는 많은 정당한 이유가 있습니다 ... 메모리에 어떤 상태를 가진 단일 코디네이터를 갖는 것과 같은 ...
jonasfj

17
그의 앱에 대해 잘 모르므로 귀하의 의견은 상당히 판단력이 있다고 생각합니다.
wobbily_col

60

또한 http://kaffeine.herokuapp.com (내 제작)을 사용해 볼 수 있으며 Heroku 앱이 절전 모드로 전환되지 않도록하기 위해 만들어졌습니다. 앱이 10 분마다 핑되므로 앱이 절전 모드로 전환되지 않습니다. 완전 무료입니다.


1
서비스에서 herokuapp를 제거 할 수 있습니까?
유성

2
더 이상 새로운 앱을 허용하지 않습니다. GitHub 페이지에는 이에 관한 몇 가지 문제가 있습니다. 이 답변은 이제 쓸모없는 것으로 간주 될 수 있습니다.
nickolay.laptev

45

http://pingdom.com/ 을 사용 하여 앱을 확인할 수 있습니다. 매분 정도 수행되면 heroku는 앱을 유휴 상태로 만들지 않으며 회전 할 필요가 없습니다.


2
두 답변 중에서 결정하기가 어렵습니다! 결국 나는 이미 계정이 있기 때문에 Newrelic과 함께 갔다. 이 큰 제안에 감사드립니다. 실제로 내 문제도 해결했습니다. :) +1.
sscirrus

2
왜 매분마다? @ newe1344의 답변에서 볼 수 있듯이 Heroku는 한 시간 동안 활동이 없으면 dyno를 스핀 다운합니다. 59 분마다 고정하는 것이 더 효율적입니까?
다윈 테크

2
그것은 분 주파수가 모두 방지 잠 잘 작동하므로, 아래로, 그리고보고 다운 타임 때보고
제시 Wolgamott

나는 그 (여전히) 무료라고 생각하지 않습니다.
rahulserver

@rahulserver-맞습니다. Pingdom은 더 이상 무료 계정을 가지고 있지 않습니다.
John Lehmann

40

쉬운 답변-서비스를 소중하게 생각하면 비용을 지불하십시오.

유료 서비스의 이점을 누리려면 이러한 모든 '트릭'이 필요합니다. 여기에 목록을 작성하는 것도 의문의 여지가 있습니다. 다음은 게임 해적 방법에 대한 속임수?

다른 포스터와 마찬가지로, 나는 개발과 테스트를위한 무료 서비스를 중요하게 생각하며, 프리 로더가 너무 많아서 Heroku가 그것을 없애면 모든 윤리적 장애 유형에 크게 짜증을 낼 것입니다. 나는 그가 그의 비판에 충분히 직접적이라고 생각하지 않습니다.


14
특정 조건의 유료 서비스입니다. 서비스를 최대한 활용하기 위해 해당 용어 내에서 서비스 사용을 최적화하십시오.
pkinsky

8
글쎄, 나는 이미 그 이유를 지적했다고 생각하지만, 조금 더 자세히 설명하면 무료 호스팅의 의도 된 사용이 분명합니다. 그리고 '항상 켜기'의 장점은 두 번째 근로자의 구심도 지불하는 특권입니다. 여기에있는 모든 악용에는 서비스 비용을 지불하는 데 쓸모없는 리소스가 소비됩니다. 부끄러운 행동입니다. 왜 걱정해야합니까? 그들이 쇠약 해지면, 그들의 의지가 의도 한대로 사용 된 무료 서비스를 없애고 나에게 큰 가치가 있기 때문입니다.
elc

2
다운 보 터들에게 당신을 명확하게 설명하기 위해, 그는 "그 주위에 방법이 있습니까?"라고 묻지 않습니다. 그는 또한 "내가 지불해야 하는가 ..."라고 묻습니다. 이것이 제가 대답하는 것입니다. 더 근본적인 질문입니다. 물론 우회하기 쉬운 수많은 방법이 있습니다. 그것들은 윤리적으로 잘못되었으므로 여기에서 그것들을 자세히 설명하는 것은 시간 낭비 일뿐 아니라, 나쁜 행동을 가능하게하고 장려하기 때문에 상당히 나빠질 것입니다.
elc

4
그것은 조금 지나친 것입니다. 테스트하는 동안 heroku에 배포합니다. 고객이 유휴 상태 일 때 사이트를 방문하면 서비스에 연결하기 위해 개발 한 앱에 문제가 있다고 가정합니다. 하루의 빛을 결코 볼 수없는 앱을 시연 할 수 있도록 반응을 위해 사이트를 운영 상태로 유지하는 것은 비 윤리적 인 일이 아닙니다. 윤리가 아닌 개인적인 신념처럼 들립니다. 그것이 규칙이나 법을 위반하지 않는다면, 윤리적 가정 만이 잘못된 것 입니다. Freemium은 합법적 인 비즈니스 모델입니다. 그것의 자유로운 부분을 "이용"하는 것은 괜찮습니다. 예상됩니다.
Matt Long

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

잠을 자지 않는 것 같습니다. 그러나 자동으로 다시 올라갑니다. 이 동작이 변경으로 인한 것인지 모르겠지만 실제로 솔루션은 거의 2 년 전에 시작되었습니다.
jgato

20

Heroku에서 제공하는 Heroku Scheduler 애드온을 무료로 사용합니다. 일단 추가되면 'curl http://yourapp.herokuapp.com '으로 10 분 간격 으로 작업을 만드는 것이 간단 합니다.


11

Heroku 문서에서 하나 이상의 웹 dyno를 갖는 것은 결코 유휴 상태가되지 않을 것이라고 말합니다. Pierre가 제안한 것처럼 시간당 $ 0.09보다 저렴한 솔루션 일 수 있습니다.

여기에 이미지 설명을 입력하십시오

선적 서류 비치


6
Heroku 애드온에는 무료 표준 버전이 있습니다.
sscirrus

9

나는 그 단계들을 적었다 :

준비 및 생산 아래 Gemfile에 보석 'newrelic_rpm'를 추가 ➜
설치 번들 ➜
Heroku가 제어판에 ➜ 로그인을하고 newrelic 부가 기능 추가
가되지 유휴 않도록 귀하의 웹 사이트에 추가되면 ➜, 설정 자동 핑을
(> 가용성 모니터링 메뉴로 ➜ 찾아보기를 설정에서) → "가용성 모니터링 켜기"를 클릭하십시오.
핑할 URL을 입력하십시오 (예 : http://spokenvote.org )
간격으로 1 분을 선택하십시오


3
감사합니다 Pratik. 참고로 매분마다 앱을 핑하면 유휴 상태에 대한 이점없이 대역폭을 사용하게됩니다. 다른 이유가 없다면, 터치를 다시 확장하는 것이 안전합니다.
sscirrus

제안에 감사드립니다 @sscirrus
Pratik Khadloya

3
Heroku는 1 시간 동안 활동하지 않으면 다이노를 잠들게하므로 간격을 1 시간으로 (또는 안전한쪽으로 50 분 정도) 조정할 수 있습니다.
David Underwood

질문 : 해당 핑 간격을 어디에서 변경해야하는지 알고 있습니까? 대시 보드 설정에서 사용 가능한 옵션이 아닌 것 같습니다.
mishap_n


3

새로운 dyno 유형 ( 현재 베타 버전) , 2015 년 6 월에 수신)은 하루에 적어도 6 시간을 자야하므로 무료 dyno를 24 시간 연중 무휴로 유지하는 것을 금지합니다.

따라서이 스레드가 나오기 전에이 스레드에서 찾은 솔루션을 제거하십시오 (또는 실제로 사용하는 서비스 비용을 지불하십시오).


3

항상 작동하는 유닉스 서버에 액세스 할 수 GET있으면 웹 사이트에 크론 작업을 설정할 수 있습니다. 무료 요금제의 새로운 조건에 따라 GET다음과 같이 crontab의 줄을 사용하여 야간 시간에 s 를 비활성화 할 수 있습니다.

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

이것은 8 시간에서 22 시간 사이에 20 분마다 domain.com에 지시 curl합니다 GET.

알고

  1. 귀하의 웹 사이트를보고 싶어하는 모든 사람이 귀하의 시간대에 살고 있지는 않습니다.
  2. 귀하의 사이트는 한밤중에 다른 요청을 수신하여 귀하의 dyno를 깨워 각 요청에 대해 추가로 1 시간의 사용 시간을 유발할 수 있습니다. 다른 사람이 도메인을 모르더라도 항상 활성화되는 봇과 크롤러가 있습니다. 따라서 이러한 깨우기에 대한 버퍼를 제공하기 위해 crontab에 정의 된 프로세스를 14-16 시간 동안 만 활성화하도록 설정하는 것이 좋습니다.

또한 시스템 시간이 올바르게 설정되어 다운 타임 창이 예상대로 발생하는지 확인하십시오.


3

여기에있는 대부분의 답변은 구식이거나 현재 작동하지 않습니다. 현재 개인 계정의 프리 티어는 매월 550 개의 무료 dyno 시간을 제공합니다 .

그리고 확인 된 무료 계정은 1000 시간의 무료 dyno를 제공합니다. 무료 앱을 깨우는 방법에 대한 기사를 썼습니다.

https://link.medium.com/uDHrk5HAD0

2019 년 솔루션이 필요한 사람에게 도움이되기를 바랍니다.


2

이것은 루트 URL 경로에 2 분마다 하나의 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.