Heroku для сайтов с небольшим трафиком

24 June 2013 #heroku #tips

В прошлом году я описывал в статье Heroku в качестве хостинга сайтов о том, как можно использовать Heroku для размещения своих статических сайтов. Но у Heroku есть одна особенность, которая затрудняет его использование в виде обычного хостинга. Если в течение часа к сайту никто не обращался, то сайт “засыпает”. И при последующем обращении сначала производиться запуск сайта, на что уходит порядка 30 секунд, и только после этого он оказывается доступным.

В интернете находятся различные рецепты того, как заставить Heroku постоянно поддерживать сайты в рабочем состоянии, если посетителей мало. В качестве вариантов предлагается использовать newrelic (что возможно при использовании Rails), либо просто обращаться к страницам своего сайта, используя scheduler. Единственно, везде, где встречал описание шедулера, используется дополнительный процесс в том же приложении, который стоит денег. Немного подумал, а зачем это делать? Если можно просто завести отдельное приложение, на которое возложить данную задачу.

За выходной написал небольшую программу wake-heroku. Сначала думал о том, чтобы задействовать шедулер, но там приходиться часть действий совершать руками, что неудобно, плюс есть ограничения на диапазоны времени, через которое происходит обработка событий (10 минут, час и день – это все что есть). Поэтому для реализации приложения воспользовался гемом clockwork.

Для использования сначала клонируем репозиторий:

$ git clone https://github.com/Juev/wake-heroku.git
$ cd wake-heroku

Теперь нам необходимо отредактировать файл worker.rb, в котором необходимо изменить временной интервал, по умолчанию используется 20 минут. И затем указать свои сайты, что необходимо поддерживать в рабочем состоянии. По умолчанию используется только один сайт, но строчку можно клонировать:

include Clockwork

every(20.minutes, 'Fetch data from meta-info') do
  Net::HTTP.get(URI('http://meta-info.heroku.com'))
  Net::HTTP.get(URI('http://asdad-sdff.heroku.com'))
  Net::HTTP.get(URI('http://sfsf-werw-wr.heroku.com'))
end 

Далее необходимо установить на компьютер Heroku toolbelt, если не сделали этого ранее. Сохраняем произведенные изменения и создаем новый сайт:

$ git commit -a -m "New changes"
$ heroku apps:create
$ git push heroku master
$ heroku ps:scale web=0 clock=1

После создания нового сайта нами произведена загрузка и конфигурирование. Последняя строка кода отвечает за то, чтобы отключить процесс web и переключиться на использование процесса clock. Теперь каждые 20 минут наши сайты будут опрашиваться с помощью данного приложения и это не позволит им уснуть. И время реакции на действия пользователя будет вполне адекватным.

В данном приложении не используется процесс типа web, поэтому оно будет постоянно активным.