如果用nodejs做服务器,很多情况下,是需要自动重启功能的。
比如:
场景1、当文件被修改时自动重启服务器。
这里的文件,可能是服务器主程序,比如修改了程序,也可以是其它依赖文件等。
例程:
两个文件,server.js是服务器文件。test30.js,用于启动监测server.js,当server.js文件内容发生变化时,自动重启之。
server.js:
require("http").createServer(function(req,res){
res.end("test");
}).listen(8000);
test30.js:
var fs = require("fs");
var exec = require("child_process").exec;
function watch(){
var child = exec("node server.js");
var watcher = fs.watch(__dirname + "/server.js",function(event){
console.log("file changed,reload");
child.kill();
watcher.close();
watch();
})
}
watch();
执行效果:
场景2、高稳定性需求,做为服务器程序的守护进程,当发现服务器意外终止时,重启之。
比如,ShareWAF(ShareWAF.com)就可以用守护进程启动,守护进程每10秒与ShareWAF主进程通信一次,万一发现ShareWAF没有回应,就重启它。
守护进程代码:
/*
* ShareWAF 守护进程
* 功能:检测ShareWAF工作是否正常,如出现异常:无法访问,则对其进行重启
* 本程序可以用forever启动,防止本进程出异常退出,达到双重守护效果
*/
process.env.UV_THREADPOOL_SIZE = 128;
const { exec } = require('child_process');
/*
* 启动ShareWAF
*/
function start_sharewaf(){
exec('forever start sharewaf.js', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
}
/*
* 关闭ShareWAF
*/
function stop_sharewaf(){
exec('forever stop sharewaf.js', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
}
//启动ShareWAF
start_sharewaf();
var request = require('request');
//sharewaf地址和端口
var sharewaf_host = "http://127.0.0.1:" + require('./config.js').shield_port + "/";
console.log("sharewaf address:",sharewaf_host);
//10秒检测一次sharewaf服务是否正常
setInterval(function(){
//访问sharewaf
request.get(sharewaf_host, {timeout: 5000}, function(err) {
if (err != null){
if(err.code == 'ETIMEDOUT' || err.code =='ECONNREFUSED' || err.code=='ESOCKETTIMEDOUT'){
//重启sharewaf
stop_sharewaf();
start_sharewaf();
}else{
console.log("Error:",err.code);
}
}
});
}, 10000);
注:因为ShareWAF是WAF(Web应用防火墙),WAF是需要高稳定性的。
执行效果:
ShareWAF的高稳定性,除了用子进程监测方式,本身还使用了三方模块forever,
forever也具有同本代码所示一样的效果,如果用forever启动的程序意外中止,也会被自动重启。