gpt4 book ai didi

node.js - 如何优雅地重启 NodeJS 服务器?

转载 作者:IT老高 更新时间:2023-10-28 22:05:39 27 4
gpt4 key购买 nike

目前,我的一个辅助项目的 prod 环境是一个 git repo,我在其中提取一些代码,使用 Ctrl-C 手动终止服务器,然后手动重新启动它。

我意识到这有很多问题。例如,如果用户仍在做一些重要的事情,而该过程正在处理敏感数据,而我刚刚杀死了它怎么办?!

当我使用 node v0.4.x 时,有一个不错的集群模块可以在应用程序处于安静状态时优雅地重新启动服务器。在 v0.6.x 中,Cluster 模块内置在 node 中,但它非常非常裸露,并且没有优雅重启的能力。

有人知道我如何在 v0.6.x 中优雅地重启 nodejs 服务器吗?

最佳答案

您可以在 Node 代码中处理 POSIX 信号。

参见示例代码,它将处理 SIGINT(例如 Ctrl-C)作为所有集群工作人员的 STOP 信号,而 SIGUSR2 将重新启动所有工作人员

所以,发出 kill -SIGUSR2 PID,其中 PID 是 Node 主 PID 将重新启动所有集群

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(){
sigkill = 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);
}
});
}
}

关于node.js - 如何优雅地重启 NodeJS 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com