如果用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(https://www.npmjs.com/package/forever)也具有同本代码所示一样的效果,如果用forever启动的程序意外中止,也会被自动重启。