visual tutorial studio servidor proyecto node español debug crear con code node.js cluster-computing restart

node.js - tutorial - npm



¿Cómo reiniciar correctamente un servidor NodeJS? (3)

Actualmente, mi entorno de producción para un proyecto paralelo es un repositorio git, donde obtengo algo de código, mato manualmente el servidor con Ctrl-C y lo reinicio manualmente.

Me doy cuenta de que hay muchas cosas mal con esto. Por ejemplo, ¿qué sucede si un usuario todavía está haciendo algo importante y el proceso está procesando datos confidenciales, y simplemente lo maté?

Cuando utilicé el nodo v0.4.x, había un buen módulo de clúster que podía reiniciar el servidor sin problemas, cuando la aplicación se encontraba en un estado silencioso. En v0.6.x, el módulo Cluster está integrado en el nodo, pero está muy, muy desnudo, y no tiene la capacidad de reinicio elegante.

¿Alguien sabe cómo puedo reiniciar con gracia un servidor nodejs en v0.6.x?


Hay un módulo llamado Forever .

Eso puede reiniciar con gracia el proceso. Supongo que entonces, de alguna manera, puede ejecutar varias instancias con clúster (una en cada núcleo) y usar Forever para monitorear / reiniciarlas.

Esta es solo una opción que encontré; Estoy abierto a sugerencias!


Puede manejar señales POSIX en código de nodo.

Vea en el código de ejemplo, que manejará SIGINT (Ctrl-C por ejemplo) como una señal de PARO para todos los trabajadores del clúster, y SIGUSR2 simplemente reiniciará todos los trabajadores

Por lo tanto, emitir kill -SIGUSR2 PID , donde PID es el nodo maestro, PID reiniciará todo el clúster

module.exports = function(app) { var cluster = require(''cluster''); var numCPUs = require(''os'').cpus().length; var workerList = new Array(); var sigkill = false; if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { var env = process.env; var worker = cluster.fork(env); workerList.push(worker); } process.on(''SIGUSR2'',function(){ console.log("Received SIGUSR2 from system"); console.log("There are " + workerList.length + " workers running"); workerList.forEach(function(worker){ console.log("Sending STOP message to worker PID=" + worker.pid); worker.send({cmd: "stop"}); }); }); process.on(''SIGINT'',function(){ sigint = true; process.exit(); }); cluster.on(''death'', function(worker) { if (sigkill) { logger.warn("SIGKINT received - not respawning workers"); return; } var newWorker = cluster.fork(); console.log(''Worker '' + worker.pid + '' died and it will be re-spawned''); removeWorkerFromListByPID(worker.pid); workerList.push(newWorker); }); } else { process.on(''message'', function(msg) { if (msg.cmd && msg.cmd == ''stop'') { console.log("Received STOP signal from master"); app.close(); process.exit(); } }); app.listen(3000); } function removeWorkerFromListByPID(pid) { var counter = -1; workerList.forEach(function(worker){ ++counter; if (worker.pid === pid) { workerList.splice(counter, 1); } }); } }


También hay un módulo llamado PM2 . Tiene la capacidad de detener todos los procesos en un clúster.