在Heroku的免费应用程序中,dyno似乎一直在空转——我的应用程序流量很低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno,这也是不能接受的。

坦率地说,在这样的等待下,许多人甚至在第一页显示之前就离开了。

所以,我遇到了一个问题:当我每天的流量都在个位数时,我是否应该每月支付36美元来为每个用户节省令人尴尬的漫长20秒?

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


当前回答

你可以使用http://pingdom.com/来检查你的应用;如果每分钟左右执行一次,heroku将不会闲置你的应用程序,也不需要旋转。

其他回答

我使用的Heroku调度插件由Heroku免费提供。一旦添加,它就像创建一个带有“curl http://yourapp.herokuapp.com”和10分钟间隔的作业一样简单。

如果你正在使用带有express的nodejs,你可以添加一个每10分钟调用一次自己的端点。

路由器:

app.get("/keep-alive",require("path/to/keepAlive.js").keepAlive);

keepAlive.js

let interval;

function keepAlive(req, res) {
   if(interval) return res.end();
   
   interval = setInterval(() => {
      fetch("http://your-heroku-subdomain/keep-alive")
         .catch(err => {/*handle error here*/});
      }
   ,60_000);


   return res.end();
}

module.exports = { keepAlive }

如果你有unix服务器的访问权限,你可以设置一个cron作业来获取你的网站。根据免费计划的新条款,您可能希望在夜间禁用get,使用crontab中的一行,如下所示:

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

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

请注意

不是每个想看你网站的人都生活在你的时区 您的站点可能会在半夜接收其他请求,从而唤醒您的dyno,并为每个请求增加一个小时的使用时间。即使没有人知道你的域名,也有机器人和爬虫一直在活动。因此,建议将crontab中定义的进程设置为仅活动14到16小时,以提供对这些唤醒的缓冲

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

使用Node.js 0.10在我自己的Heroku应用上进行了测试和工作。X在2013年6月28日

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

我有一个只需要在周一到周五午餐时间运行的应用程序。 我刚刚在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