Nodo.configuración de js para una fácil implementación y actualización


Actualmente estamos desarrollando un sitio web (TYPO3 bajo Apache) para un cliente que es compatible con una aplicación node.js/socket.io que proporciona actualizaciones en tiempo real al contenido servido desde el CMS.

Ya que este es nuestro primer nodo.proyecto js No tengo buenas prácticas que seguir cuando se trata de' la configuración perfecta', así que he pasado algún tiempo investigando técnicas de implementación.

Me quedan un par de preguntas para lograr una buena configuración que:

  1. Es fácil de implementar para el cliente . Esto es muy importante porque nuestro sitio web se integrará en su instalación 'live' TYPO3 que sirve a una gran cantidad de sitios web y se ejecuta en servidores que no son administrados por el cliente, sino por otra organización (centralizada) que hace que las llamadas de soporte y los cambios en el servidor sean un proceso lento.

  2. Debería ser fácil de actualizar. Como se mencionó solicitar reinicios y hacer servidor los cambios son un proceso lento, por lo que idealmente la instalación del nodo debe reiniciarse / actualizarse cuando recibe cambios que se empujan a la instalación en vivo usando git.

Despliegue

El consenso general parece ser usar forever cuando se trata de implementar aplicaciones de nodo para mantenerlas en ejecución. He probado forever, y parece funcionar bien cuando se instala por npm install forever -g (global). Esto requeriría asistencia externa para instalar globalmente en el live sin embargo, prefiero que se ejecute desde el directorio node_modules de la aplicación, pero no he sido capaz de crear un contenedor sólido para hacerlo.

Además, forever funciona bien, pero tiene que iniciarse manualmente. ¿Cuál sería el mejor enfoque para garantizar que se inicia en el arranque del servidor y se sigue ejecutando?

  • Un simple init.d script?
  • ¿Escribir un envoltorio de perro guardián?
  • ¿Una tarea del programador TYPO3 que comprueba el estado de forever?

Desarrollo rápido / reinicio en la actualización

Actualmente todavía estamos en la etapa de desarrollo del proyecto y cada vez que hago cambios en el nodo.aplicación js Reinicio manualmente node o forever. Esto funciona, pero está lejos de ser ideal. Hay varios módulos npm más pequeños que comprueban las modificaciones de los archivos y reinician node cuando se detectan cambios, como:

¿Alguien tiene experiencia con cualquiera de estos?

Actualización: ¿Por qué no solo usas Cluster?

El módulo de clúster proporciona una funcionalidad similar a través del mecanismo reload, pero no funciona con el nodo 0.5+. El el módulo core Cluster (Nodo 0.6+) que lo reemplazó no tiene todas estas características, sino que solo proporciona clústeres. Que a su vez no juega bien con socket.io . Al menos no sin usar Redis (que es un problema para nosotros, porque no podemos forzar otro servicio prereq al cliente).

--

Obviamente estoy tratando de encontrar la solución más estable que combine una actualización-restarter con forever antes de entregar el proyecto al cliente y realmente espero que alguien haya producido una combinación probada de técnicas.

Author: Community, 2012-06-18

3 answers

Combinando todo el conocimiento reunido (Muchas gracias a Julian Knight por las ideas) y los métodos probados en la semana pasada, he decidido conformarme con la solución de implementación que se describe a continuación (Pensé que estaría bien compartir para ayudar a otros con preguntas comparables):{[15]]}

Reinicio automático en errores de scripty la recarga automática en los cambios de script es manejada por para siempre, ya que también incluye un reloj de guión, siempre y cuando para siempre es generado desde dentro de un nodo.guión js.

Para hacerlo, he agregado un server.js para lanzar el script app.js que realmente queremos ejecutar:

Servidor.js

var forever = require('forever'),
    child = new(forever.Monitor)('app.js', {
        'silent': false,
        'pidFile': 'pids/app.pid',
        'watch': true,
        'watchDirectory': '.',      // Top-level directory to watch from.
        'watchIgnoreDotFiles': true, // whether to ignore dot files
        'watchIgnorePatterns': [], // array of glob patterns to ignore, merged with contents of watchDirectory + '/.foreverignore' file
        'logFile': 'logs/forever.log', // Path to log output from forever process (when daemonized)
        'outFile': 'logs/forever.out', // Path to log output from child stdout
        'errFile': 'logs/forever.err'
    });
child.start();
forever.startServer(child);

Esto observa todos los archivos en el directorio de la aplicación en busca de cambios y reinicia el script que se ejecuta en forever tan pronto como uno cambia. Debido a que los registros y el pidfile se encuentran en subdirectorios de la aplicación, deben ignorarse desde la vigilancia del archivo, o el script se repetirá reinicia:

.foreverignore

pids/**
logs/**

Para hacer que todo esto se inicie en el arranque del sistema y nos permita controlar fácilmente el servicio utilizando start node-appy stop node-app usamos Upstart de Ubuntu. He combinado dos ejemplos ( este y este uno) en uno que hace el trabajo bastante bien:

/etc / init / node-app.conf

# This is an upstart (http://upstart.ubuntu.com/) script
# to run the node.js server on system boot and make it
# manageable with commands such as
# 'start node-app' and 'stop node-app'
#
# This script is to be placed in /etc/init to work with upstart.
#
# Internally the 'initctl' command is used to manage:
# initctl help
# initctl status node-app
# initctl reload node-app
# initctl start node-app

description "node.js forever server for node-app"
author      "Remco Overdijk <[email protected]>"
version "1.0"

expect fork

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env HOME=/home/user/node-app-dir

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME=$HOME
    chdir $HOME
    exec /usr/local/bin/node server.js > logs/node.log &
end script

#post-start script
#   # Optionally put a script here that will notifiy you node has (re)started
#   # /root/bin/hoptoad.sh "node.js has started!"
#end script

Como Kevin menciona sabiamente en su artículo es imprudente ejecutar node como root, así que cambiaremos eso a exec sudo -u www-data /usr/local/bin/node cuando nos mudemos a nuevos servidores la próxima semana.

Por lo tanto, forever se inicia automáticamente por node server.js que se inicia por upstart, y supervisa los bloqueos y los cambios de archivos, manteniendo toda la configuración funcionando todo el tiempo que queramos.

Espero que esto ayude a alguien.

 63
Author: Rem.co,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:57

Ya que mi última respuesta es para el futuro! Aquí hay algunos otros enlaces para ayudar:

Todavía no parece haber una respuesta perfecta, pero hay muchas personas que ejecutan instancias de nodo de producción. Espero que esto te apunte en la dirección correcta.

 7
Author: Julian Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:19

Podría ser mejor, para uso de producción, mirar algo como Cluster. Es posible que no desee las características del clúster, pero también incluye otras características de producción, como cero reinicios de tiempo de inactividad, registros, trabajadores, etc.

Como usted dice, Forever está bien para las pruebas, pero en realidad no tiene lo que se necesita para el uso de producción.

Me parece recordar vagamente que el Cluster o algo similar puede ser adoptado en el Nodo mismo come v0. 7

 5
Author: Julian Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-18 20:26:54