LINUX根据系统负载值自动重启Web服务并短信通知
当服务器受到攻击或者其他情况引起系统负载过高,这时候连SSH都很难登陆进去,想重启都很难,所以有必要使用程序自动化在系统负载高的情况下,帮忙重启web服务,甚至整个服务器!
就拿前段时间本VPS受到的DDOS攻击来说,其实DDOS也是利用大量发起的请求,导致被攻击VPS(或服务器)内存资源被耗尽,系统负载过高,而导致80端口的Http服务无响应,从而达到最终的攻击目的。DDOS虽然防不胜防,不过总还是有一些办法,能把DDOS的影响减小的。比如定时监控系统状态,然后自动重启Web服务,这也是本文要介绍的一种方法。
在VPS被攻击的时候,有一些系统指标能反应出系统是否处于被攻击状态,一个就是查看内存剩余量,当然,这并不是最准确的方法,另外一种,就是查看Linux的系统平均负载值。
Linux系统负载介绍
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
-
它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用’wait’)
- 没有被停止(例如:等待终止)
Linux系统中,通过很多命令都可以查看当前的系统平均负载值,比如:w,top或者uptime命令
命令输出的内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
通常情况下,这些值会根据系统的CPU个数有一些区别,对于单核CPU来说,如果负载值达到了1,表明系统负载已经达到了100%,不过对于双核系统来说,1只表示系统负载值只达到50%左右。
以此类推,在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么
4.00 就说明主机具有四个处理器。
根据系统负载值自动重启Web服务
下面的脚本,以装有Apache服务器为例,定时判断系统负载值,当达到3时,认为系统已经超负荷运转,这时,脚本会自动重启Apache服务,释放系统资源,以达到让服务器平稳运行的目的。
脚本内容如下:
输入下面的命令,然后将上面的命令行输入VI编辑器打开的checkload.sh文档
:wq保存退出,然后:
sh /root/checkload.sh是尝试允许,如果没有错误值,那就可以了。
脚本中TOP_SYS_LOAD_NUM表示最大允许的系统平均负载值,当超过这一值的时候,脚本就开始重启apache服务。脚本的使用也挺简便,直接
运行自动任务编辑器,填入如下内容即可:
或者直接执行
安装成功后请用 crontab -l
来查看是不是被设定好了定时执行
这里*/3,表示每三分钟执行一次指定的脚本,并将执行结果输出到/root/checkload.log文件中。你也可以根据自己的需要,来修改执行频率。
小结此脚本已经部署到我的VPS上一段时间,从使用的情况来看,效果还比较不错。
另外因为没有进行限制日志文件会一直增大,所以还是建议再添加一条删除日志LOG的定时任务
crontab -e
后面追加:
* * */7 * * rm -rf /root/checkload.log
就拿前段时间本VPS受到的DDOS攻击来说,其实DDOS也是利用大量发起的请求,导致被攻击VPS(或服务器)内存资源被耗尽,系统负载过高,而导致80端口的Http服务无响应,从而达到最终的攻击目的。DDOS虽然防不胜防,不过总还是有一些办法,能把DDOS的影响减小的。比如定时监控系统状态,然后自动重启Web服务,这也是本文要介绍的一种方法。
在VPS被攻击的时候,有一些系统指标能反应出系统是否处于被攻击状态,一个就是查看内存剩余量,当然,这并不是最准确的方法,另外一种,就是查看Linux的系统平均负载值。
Linux系统负载介绍
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
-
它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用’wait’)
- 没有被停止(例如:等待终止)
Linux系统中,通过很多命令都可以查看当前的系统平均负载值,比如:w,top或者uptime命令
命令输出的内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
通常情况下,这些值会根据系统的CPU个数有一些区别,对于单核CPU来说,如果负载值达到了1,表明系统负载已经达到了100%,不过对于双核系统来说,1只表示系统负载值只达到50%左右。
以此类推,在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么
4.00 就说明主机具有四个处理器。
根据系统负载值自动重启Web服务
下面的脚本,以装有Apache服务器为例,定时判断系统负载值,当达到3时,认为系统已经超负荷运转,这时,脚本会自动重启Apache服务,释放系统资源,以达到让服务器平稳运行的目的。
脚本内容如下:
#!/bin/sh
#usage: */3 * * * * /root/checkload.sh >>/root/checkload.log
TOP_SYS_LOAD_NUM=3
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
/usr/sbin/apachectl stop
sleep 8
pkill httpd
sleep 8
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
输入下面的命令,然后将上面的命令行输入VI编辑器打开的checkload.sh文档
vi checkload.sh
:wq保存退出,然后:
chmod +x checkload.sh
sh /root/checkload.sh
sh /root/checkload.sh是尝试允许,如果没有错误值,那就可以了。
脚本中TOP_SYS_LOAD_NUM表示最大允许的系统平均负载值,当超过这一值的时候,脚本就开始重启apache服务。脚本的使用也挺简便,直接
crontab -e
运行自动任务编辑器,填入如下内容即可:
*/3 * * * * /root/checkload.sh >>/root/checkload.log
或者直接执行
echo '*/3 * * * * /root/checkload.sh >>/root/checkload.log' >> /var/spool/cron/root
安装成功后请用 crontab -l
来查看是不是被设定好了定时执行
这里*/3,表示每三分钟执行一次指定的脚本,并将执行结果输出到/root/checkload.log文件中。你也可以根据自己的需要,来修改执行频率。
小结此脚本已经部署到我的VPS上一段时间,从使用的情况来看,效果还比较不错。
另外因为没有进行限制日志文件会一直增大,所以还是建议再添加一条删除日志LOG的定时任务
crontab -e
后面追加:
* * */7 * * rm -rf /root/checkload.log
checkload.log 这个文件会一直增大,所以要记得及时删除。
另外我个人是将checkload.log文件保存到/tmp/目录下,这样重启就会自动删除
另附上一段改进后代码,在机器重启APACHE的时候会给你发一封邮件,这里使用139邮箱,因为139邮箱有免费的邮件到达短信通知
大家也可以根据自己情况自定义
#!/bin/sh
#usage: */3 * * * * /root/checkload.sh >>/root/checkload.log
TOP_SYS_LOAD_NUM=3
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l` | mail -s "Critical Info" [email protected]
/usr/sbin/apachectl stop
sleep 8
pkill httpd
sleep 8
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
上面的例子我用MAIL函数发邮件没有成功,改用mutt
正常centos默认是有安装mutt的,如果没有
请yum mutt
代码改成如下:
#!/bin/sh
#usage: */3 * * * * /root/checkload.sh >>/root/checkload.log
TOP_SYS_LOAD_NUM=3
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l` | mutt -s "Apache restart" [email protected]
/usr/sbin/apachectl stop
sleep 8
pkill httpd
sleep 8
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
正常情况下,我们是无须知道正常重启的信息的,我们只需要知道APACHE重启失败了的失败信息,以方便第一时间来处理,因此我们设置了以下脚本,在APACHE启动失败的情况下,给您的139信息发邮件,邮件会自动短信提醒,因此就相当于是给您的服务器设置了个APACHE失效的短信提醒功能
#!/bin/sh
#usage: */3 * * * * /root/checkload.sh >>/root/checkload.log
TOP_SYS_LOAD_NUM=3
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
/usr/sbin/apachectl stop
sleep 8
pkill httpd
sleep 8
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
echo "Result:" $(date +"%y-%m-%d %H:%M:%S") "httpd:" `ps -ef | grep httpd | wc -l` "mysqld:" `ps -ef | grep mysqld | wc -l` | mutt -s "Server Busy Apache Try restart" [email protected]
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
result=`pidof httpd`
if [ "$result" == "" ];then
echo $(date +"%y-%m-%d %H:%M:%S") "apache fail to start" | mutt -s "Apache restart" [email protected]
fi
顶(3)
踩(0)
- 最新评论