Node.JS实战30:自动重启服务器。

如果用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启动的程序意外中止,也会被自动重启。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值