Node.JS с навсегда на Heroku - PullRequest
10 голосов
/ 28 декабря 2011

Итак, мне нужно запустить свое приложение node.js на heroku, оно работает очень хорошо, но когда мое приложение падает, мне нужно что-то перезапустить, поэтому я добавил навсегда в package.json и создал файл с именем навсегда.js с этим:

var forever = require('forever');

var child = new (forever.Monitor)('web.js', {
  max: 3,
  silent: false,
  options: []
});

//child.on('exit', this.callback);
child.start();

forever.startServer(child);

на моем Procfile (который герою использует, чтобы знать, с чего начать), я положил:

web: node forever.js

хорошо!Теперь каждый раз, когда мое приложение вылетает, оно автоматически перезапускается, но время от времени (почти каждые 1 час) heroku начинает выдавать H99 - Ошибка платформы, и об этой ошибке говорят:другие ошибки, которые потребуют от вас действий для исправления, эта ошибка не требует действий от вас.Повторите попытку через минуту или проверьте статус сайта.

Но я просто вручную перезагружаю свое приложение, и ошибка исчезает, если я этого не делаю, может пройти несколько часов,сама.

Может кто-нибудь помочь мне здесь?Может быть, это навсегда проблема?Вопрос о герою?

1 Ответ

10 голосов
/ 26 июля 2012

Это проблема с бесплатными учетными записями Heroku: Heroku автоматически убивает неоплаченные приложения через 1 час бездействия, а затем раскручивает их обратно при следующем поступлении запроса. (Как упоминалось ниже, это не относится к платным учетным записям.Если вы масштабируете до двух серверов и платите за второй, вы получаете два постоянно включенных сервера.) - https://devcenter.heroku.com/articles/dynos#dyno-sleeping

Такое поведение, вероятно, не очень хорошо работает с forever.Чтобы подтвердить это, запустите heroku logs и найдите строки «Холостой ход» и «Остановка процесса с помощью SIGTERM», а затем посмотрите, что будет дальше.

Вместо использования forever, вы можете попробовать использоватьCluster API и автоматически создавать нового потомка каждый раз, когда он умирает.http://nodejs.org/api/cluster.html#cluster_cluster хороший пример, вы просто поместите свой код в блок else.

В результате ваше приложение теперь намного стабильнее, плюс оно может использовать все доступные ядра ЦП (4 по моему опыту).

Недостатком является то, что вы не можете хранить какие-либосостояние в памяти.Если вам нужно сохранить сессии или что-то в этом духе, попробуйте бесплатное дополнение Redis To Go (heroku addons:add redistogo).

Вот пример, который в настоящее время работает на heroku с использованием cluster и Redis To Go: https://github.com/nfriedly/node-unblocker

ОБНОВЛЕНИЕ: Heroku недавно внесла некоторые важные изменения в работу бесплатных приложений и большиеВо-первых, они могут быть в сети не более 18 часов в день, что делает его практически непригодным в качестве «настоящего» веб-сервера.Подробности в https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

ОБНОВЛЕНИЕ 2: Они изменили это снова.Теперь, если вы подтвердите свой идентификатор, вы можете постоянно запускать 1 бесплатную версию dyno: https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...