2011-12-28 10 views
9

Por lo tanto, tengo que ejecutar mi aplicación node.js en heroku, funciona muy bien, pero cuando mi aplicación falla, necesito algo para reiniciarla, así que agregué para siempre a package.json y crea un archivo con nombre forever.js con esto:Node.JS con forever en Heroku

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

en mi Procfile (que heroku utiliza para saber qué se inicia) puse:

web: node forever.js 

bien! Ahora cada vez que mi aplicación falla, se reinicia de automóviles, pero, de vez en cuando (casi cada 1 hora), heroku comienza a lanzar H99 - Error de plataforma, y ​​sobre este error, dicen:

A diferencia de todos los demás errores lo cual requerirá que usted lo corrija, este no requiere ninguna acción de su parte. Inténtalo de nuevo en un minuto o revisa el sitio de estado.

Pero simplemente reinicio manualmente mi aplicación y el error desaparece, si no lo hago, puede tardar horas en desaparecer por sí mismo.

¿Alguien me puede ayudar aquí? Tal vez este es un problema para siempre? ¿Un problema heroku?

+0

¿Entendió cuál es el motivo? – pars

+1

No, pero eliminé para siempre, no es necesario en heroku, debe evitar los errores para que su aplicación siga ejecutándose –

+2

, entonces ¿heroku reinicia automáticamente su aplicación cuando se bloquea ahora? – hellatan

Respuesta

8

Este es un problema con las cuentas gratuitas de Heroku: Heroku mata automáticamente las aplicaciones no pagas después de 1 hora de inactividad, y luego las devuelve la próxima vez que ingrese una solicitud. (Como se menciona abajo, esto no se aplica a las cuentas pagas . Si amplía hasta dos servidores y paga por el segundo, obtiene dos servidores siempre encendidos). - https://devcenter.heroku.com/articles/dynos#dyno-sleeping

Probablemente este comportamiento no esté funcionando bien con forever. Para confirmar esto, ejecute heroku logs y busque las líneas "Al ralentí" y "Detener el proceso con SIGTERM" y luego vea qué viene después.

En lugar de utilizar forever, es posible que desee probar el uso de la API de clúster y crear automáticamente un nuevo elemento secundario cada vez que muera. http://nodejs.org/api/cluster.html#cluster_cluster es un buen ejemplo; simplemente pondría su código en el bloque else.

El resultado es que su aplicación ahora es mucho más estable y además usa todos los núcleos de CPU disponibles (4 en mi experiencia).

El inconveniente es que no se puede almacenar ningún estado en la memoria. Si necesita almacenar sesiones o algo similar, pruebe el complemento gratuito Redis To Go (heroku addons:add redistogo).

He aquí un ejemplo que se están ejecutando en heroku usando cluster y Redis To Go: https://github.com/nfriedly/node-unblocker

ACTUALIZACIÓN: Heroku ha hecho recientemente algunos cambios importantes en la forma en aplicaciones gratuitas trabajar, y el grande es que sólo pueden estar en línea para un máximo de 18 horas por día, por lo que es efectivamente inutilizable como un servidor web "real". Detalles en https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

ACTUALIZACIÓN 2: Lo cambiaron de nuevo. Ahora, si verifica su ID, puede ejecutar 1 dyno gratis constantemente: https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours

+1

Tienes razón en que Heroku hace esto, sin embargo, solo para aplicaciones de una sola dyno gratis. Los niveles pagos siempre permanecen altos. –

+2

Además, los procesos de los trabajadores nunca están inactivos – kgilpin

+1

puede usar el servicio de supervisión que seguirá haciendo ping a su servidor para siempre y así mantenerlo vivo. –

Cuestiones relacionadas