sun博客

记录点滴!

项目使用的动态dns,ip发生变化时,nginx采集不到变更后的ip地址,使用 resolver 好像还是没什么变化。被迫只能在服务器上安装node +脚本的方式,每隔30s左右,自动监测ip变化后重启nginx。

记录下知识点:

//restartNginx.js

let request = require('axios')
let cp = require('child_process');


let timeout=30000

let curIp=""
//先获取本地ip是多少
async function getLocalIp(){
   let res= await request.get('https://api.ipify.org/?format=json')
    return res.data.ip
}

function formatDate(value) {
    //将date对象转为中国标准格式字符串
    let date = "";
    if(value instanceof Date){
        date=value
    }else{
        date = new Date(value);
    }
    let y = date.getFullYear();
    let MM = date.getMonth() + 1;
    MM = MM < 10 ? ('0' + MM) : MM;
    let d = date.getDate();
    d = d < 10 ? ('0' + d) : d;
    let h = date.getHours();
    h = h < 10 ? ('0' + h) : h;
    let m = date.getMinutes();
    m = m < 10 ? ('0' + m) : m;
    let s = date.getSeconds();
    s = s < 10 ? ('0' + s) : s;
    return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
}

function restartNginx() {

    //spawn
    let ls = cp.spawn('sudo'/*command*/, ['nginx', '-s','reload']/*args*/, {}/*options, [optional]*/);
    ls.stdout.on('data', function (data) {
        console.log('stdout: ' + data);
    });

    ls.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });

    ls.on('exit', function (code) {
        if(code==0){
            console.log("nginx 重启成功!")
        }else{
            console.log('child process exited with code ' + code);
        }

    });
}
async function run(){
    try {
        let localIp=await getLocalIp()
        if(!curIp){
            console.log(`当前ip地址为:${localIp}`)
            curIp=localIp
        }else{
            if(curIp!==localIp){
                console.log(`ip已发生变动--当前ip:${localIp},之前ip:${curIp},当前时间${formatDate(Date.now())}--正在重启nginx`)
                restartNginx()
            }
            curIp=localIp
        }


    }catch (e) {
        console.log(e)
    }
    setTimeout(run,timeout)

}

run()
//restartNginx()
//setTimeout(run,timeout)

安装nodejs 到linux 教程:

https://blog.csdn.net/m0_37714470/article/details/117956075

一开始想着node restartNginx.js 就可以了,结果发现,shell窗口关闭后,使用ps -ef|grep node发现,node进程停了。。

一开始以为是权限不够,得要用管理员权限,于是sudo node restartNginx.js,发现不识别sudo node,百度后才知道,sudo 只能使用安全路径(security path),无奈下只能使用软链接附加到某个安全链接中。

ln –s 源文件 目标文件

sudo node restartNginx.js 确实是可以了,但退出shell,进程还是被删除,看来还不行。

想直接将账号升级到管理员,于是su,提示输入密码,一直都是证书登陆shell,哪知道密码啊,找客服也找不到,网上找了半天,没找到,也只能放弃。

后面想起可能需要进程守护,自然想起pm2,但pm2太大了,杀鸡能用牛刀吗?于是找到网上的linux 的进程守护程序,nohup

使用方法:

nohup node restartNginx.js &

后面的&不能省略,一开始没加,退出shell 时仍旧没有node进程。

nohup node restartNginx.js & 后,输入exit,退出nohup,再次exit退出shell后再打开,node进程存在,至此搞定。

生成有个nohup.out的文件,还挺方便的,可以随时查看。

小插曲,给nodejs添加环境变量时,把

export PATH=$PATH:$NODE_HOME/bin写成了 export PATH=$PAth:$NODE_HOME/bin ,(写成小写了)接着source /etc/profile后,cat用不了呢,vim也用不了,cd也用不了呢,sudo也不用了呢,基本所有的命令全部用不起。下意识到,可能path写错了,但各命令用不起了,一时懵逼不知道怎么搞,难道要重装系统吗?

还好百度后,直接/bin/vim /bin/sudo搞定。吓死我了。

另外就是nginx的重启日志在error.log中,一起以为是在access.log,结果cat 后只记录访问明细,网上没找到重启的记录日志。

cd /opt/bitnami/nginx/logs/

看到有个error.log,打开才发现记录在这里。

另外ps -ef |grep node 出现至少要有以下2个进程显示,其中一个要为执行目标的文件名称。如果没有的话,说明nohup保持出了问题导致断掉了。

bitnami@ip-172-26-32-198:~/web2/node/caiseka$ ps -ef|grep node
bitnami  14678 14668  0 00:45 pts/0    00:00:00 grep node
bitnami  26860     1  0 Aug18 ?        00:00:00 node http.js

发表评论

邮箱地址不会被公开。 必填项已用*标注