项目使用的动态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