11 votes

Node.JS avec forever sur Heroku

J'ai donc besoin de faire tourner mon application node.js sur heroku, cela fonctionne très bien, mais lorsque mon application se plante, j'ai besoin de quelque chose pour la redémarrer, j'ai donc ajouté forever au package.json, et j'ai créé un fichier nommé forever.js avec ceci :

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

sur mon Procfile (que heroku utilise pour savoir quoi démarrer) j'ai mis :

web: node forever.js

Très bien ! Maintenant, à chaque fois que mon application se plante, elle redémarre automatiquement, mais, de temps en temps (presque toutes les 1 heures), heroku commence à lancer H99 - Platform error, et à propos de cette erreur, ils disent :

Contrairement à toutes les autres erreurs dont la correction nécessitera une action de votre part, celle-ci ne nécessite aucune action de votre part. Réessayez dans une minute ou consultez le site d'état.

Mais je redémarre manuellement mon application et l'erreur disparaît. Si je ne le fais pas, elle peut mettre des heures à disparaître d'elle-même.

Quelqu'un peut-il m'aider ? Peut-être s'agit-il d'un problème permanent ? Un problème avec heroku ?

10voto

Nathan Friedly Points 1933

Il s'agit d'un problème lié aux comptes Heroku gratuits : Heroku tue automatiquement les applications non payées après 1 heure d'inactivité, puis les relance à la prochaine demande. (Comme indiqué ci-dessous, cela ne s'applique pas aux comptes payants. Si vous passez à deux serveurs et que vous payez pour le deuxième, vous obtenez deux serveurs toujours actifs). - https://devcenter.heroku.com/articles/dynos#dyno-sleeping

Ce comportement ne fait probablement pas bon ménage avec forever . Pour le confirmer, exécutez heroku logs et recherchez les lignes "Idling" et "Stopping process with SIGTERM", puis voyez ce qui se passe ensuite.

Au lieu d'utiliser forever Si vous souhaitez utiliser l'API Cluster et créer automatiquement un nouvel enfant à chaque fois qu'un autre meurt, vous pouvez essayer d'utiliser l'API Cluster. http://nodejs.org/api/cluster.html#cluster_cluster est un bon exemple, il vous suffit de placer votre code dans la section else bloc.

Le résultat est que votre application est maintenant beaucoup plus stable, et qu'elle peut utiliser tous les cœurs de processeur disponibles (4 dans mon expérience).

L'inconvénient est qu'il n'est pas possible de stocker un état en mémoire. Si vous avez besoin de stocker des sessions ou quelque chose de ce genre, essayez l'addon gratuit Redis To Go ( heroku addons:add redistogo ).

Voici un exemple qui tourne actuellement sur heroku en utilisant cluster et Redis To Go : https://github.com/nfriedly/node-unblocker

MISE À JOUR : Heroku a récemment apporté des modifications majeures au fonctionnement des applications gratuites, dont la plus importante est qu'elles ne peuvent être en ligne que 18 heures par jour au maximum, ce qui les rend inutilisables en tant que "vrai" serveur web. Plus d'informations à l'adresse suivante https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

MISE À JOUR 2 : Ils l'ont à nouveau modifié. Maintenant, si vous vérifiez votre ID, vous pouvez faire 1 dyno gratuit en permanence : https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X