背景:

在工作突发遇见了Linux虚拟机所在的宿主机重启了,虚拟机上部署nginx+keepalived服务,但是宿主机重启之后发现虚拟机重启了,但是在虚拟机上部署的nginx服务和keepalived服务没有起来,经过分析发现是因为设置的开机自启脚本存在问题导致的。

分析过程:

首选通过who -b查看最近的虚拟机重启的时间节点

[root@localhosts ~]# who -b
         system boot  2023-02-08 10:47
[root@localhosts ~]# who -r
         run-level 3  2023-02-08 10:48

注:

who -b  :---查看最后一次(上次)系统启动的时间

who -r :---查看最后一次(上次)系统启动的时间,及运行级别

 检查nginx服务和keepalived服务的运行状态

[root@localhosts ~]# ps -ef | grep nginx
root      25312  25095  0 11:32 pts/2    00:00:00 grep --color=auto nginx
[root@localhosts ~]# ps -ef | grep keepalived
root      25397  25095  0 11:32 pts/2    00:00:00 grep --color=auto keepalived

注: 发现nginx服务和keepalived服务都没有开机自启运行起来。

检查开机配置是否设置

[root@localhosts ~]# cat /etc/rc.d/rc.local 
#!/bin/bash
/usr/sbin/keepalived -D

注:发现keepalived的有设置开机,但是为什么keepalived服务也没有起来呢?

一般情况下keepalived运行的时候都会做一个检查脚本,脚本通过之后就运行起keepalived的,是否需要杀掉运行的keepalived服务。

检查keepalived服务的检查脚本:

[root@localhosts keepalived]# cat /etc/keepalived/check_nginx.sh 
#! /bin/bash
num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
if [ $num -eq 0 ]; then
    su - mwop -c "/app/nginx/bin/nginx.sh start"
    sleep 3
    num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
    if [ $num -eq 0 ]; then
        killall keepalived
    fi
fi

注:发现keepalived的检查脚本存在问题,因为nginx服务的启动路径是

sh /app/server/nginx/bin/nginx.sh start

这样的话,虽然开机自启了keepalived服务,但是因为keepalived服务的检查脚本检验不通过导致keepalived服务停止运行,同时nginx服务没有单独的自启脚本,所以就导致了nginx服务和keepalived服务都是无运行的状态。

解决方案: 

因为已经分析到了原因,就是keepalived的检查脚本有问题,所以只要修复keepalived的检查脚本即可,但是如果还想为了更全面的考虑,可以在/etc/rc.d/rc.local脚本中再加入nginx的启动命令,这样就做到了万无一失的效果,下面的两种解决方案都会写一下的,以供各位参考。

解决方案一: 

 修复后的keepalived的检查脚本如下:

[root@localhosts keepalived]# cat /etc/keepalived/check_nginx.sh 
#! /bin/bash
num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
if [ $num -eq 0 ]; then
    su - mwop -c "/app/server/nginx/bin/nginx.sh start"
    sleep 3
    num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
    if [ $num -eq 0 ]; then
        killall keepalived
    fi
fi

注:这样就可以了,可以重启一下虚拟机验证一下是否可以开机自启起来nginx服务和keepalived服务。

解决方案二:

修复keepalived的检查脚本,同时在/etc/rc.d/rc.local中加入nginx服务的启动命令

[root@localhosts keepalived]# cat /etc/keepalived/check_nginx.sh 
#! /bin/bash
num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
if [ $num -eq 0 ]; then
    su - mwop -c "/app/server/nginx/bin/nginx.sh start"
    sleep 3
    num=`netstat -an | grep "0.0.0.0:8022"|wc -l`
    if [ $num -eq 0 ]; then
        killall keepalived
    fi
fi 
 
[root@localhosts ~]# cat /etc/rc.d/rc.local 
#!/bin/bash
/usr/sbin/keepalived -D
su - mwop -c "/app/server/nginx/bin/nginx.sh start"


注:这样做的意义是给nginx服务的启动增加了两层保障。