Recargando un servidor de Node.js con WebSocket

Un sencillo servidor corriendo sobre Node.js puede permitir la recarga sin interrupciones, de manera amistosa, algo parecido al reload de Apache u otros demonios en Linux. Para ello sólo es necesario que haya un proceso padre que lance hijos y les envíe señales según sea necesario. Sin embargo el cierre de las conexiones esperando a que estas terminen puede dar algunas complicaciones cuando hay un WebSocket.

La gestión de padre e hijos se puede hacer con el módulo cluster. En este ejemplo el script a lanzar manualmente es master.js. Él a su vez lanzará al script server.js y le pasará las señales SIGHUP para recargar el servidor (terminar amistosamente) o SIGTERM para terminar sin piedad.

master.js:

'use strict';
var cluster = require('cluster');
const path = require('path');
cluster.setupMaster({
exec: path.join(__dirname, 'server.js')
});
//fork the first process
cluster.fork();
process.on('SIGHUP', function () {
var new_worker = cluster.fork();
new_worker.once('listening', function () {
//stop all other workersS
for (var id in cluster.workers) {
if (id === new_worker.id.toString()) continue;
cluster.workers[id].process.kill('SIGHUP');
}
});
}).on('SIGTERM', function () {
for (var id in cluster.workers) {
cluster.workers[id].process.kill('SIGTERM');
}
});

[…] (continuar leyendo)