相信大家都曾遇到过碰到网站Apache伺服器因为攻击等原因停止响应,虽然目前网上有很多可以对网站状态进行监控的工具,但却没有一款可以检测到错误后执行相关命令(例如重启Apache等),所以今天「畅想资源」就来教大家如何在Linux下为Apache(httpd)加入自动监测网站可否访问并执行命令(例如重启)的脚本!
脚本功能&特点
1、本脚本能够每隔一段时间检测Apache伺服器的可用性(由于脚本直接使用 curl
模拟客户端的访问,因此这里的「可用性」是指切切实实的可正常访问)
2、在出现无法访问的情况后,能够自动强制停止( kill
)并重新启动( restart
)Apache服务
3、如果在Apache重启后网站仍然无法正常访问,自动执行进一步的操作(如重启整个伺服器、发送通知邮件等等)
后文将给出此脚本的具体使用方法及注解,大家可以根据自己的情况对脚本进行手动修改!
教学
1、由于我们的脚本需要使用 curl
指令,请先于伺服器内安装Curl:
1 2 3 |
#请根据自己Linux的发行版选择不同的安装指令 yum install curl apt-get install curl |
2、然后我们在伺服器的任意位置置入「apachemonitor.sh」文件:(本例中其位置为「/root/apachemonitor.sh」)
注意:请将第四行的 URL
修改为你自己的网址、以及按照相关注释调整执行的指令!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/bash # 本脚本由 VPS管理百科 编写、并由 畅想资源 修改 # 访问:HTTP://WWW.BOOTF.COM/ 或 HTTP://WWW.AREFLY.COM/ 获取技术支持 URL="http://www.mydomain.com/" curlit(){ curl --connect-timeout 15 --max-time 20 --head --silent "$URL" | grep '200' # 上面的15是连接超时时间,若访问localhost的HTTP服务超过15秒仍然没有正确响应200头代码,则判断为无法访问。 } doit(){ if ! curlit; then # 如果localhost的Apache服务没有正常返回200头,即出现异常。执行下述命令: sleep 20 top -n 1 -b >> /var/log/apachemonitor.log # 上面将top命令内容写入日至文件备查 /usr/bin/killall -9 apache2 && /usr/bin/killall -9 php5-cgi && /usr/bin/killall -9 httpd && /usr/bin/killall -9 http && /usr/bin/killall -9 apache && /usr/bin/killall -9 php-cgi > /dev/null # 兼容起见,杀死了各种Apache的进程。可以根据自己Apache服务的特点修改及删除 sleep 2 /etc/init.d/apache2 start > /dev/null /etc/init.d/httpd start > /dev/null # 兼容起见,执行了两种Apache重启命令,可根据需要自己修改及注释 echo $(date) "Apache Restart" >> /var/log/apachemonitor.log # 写入日志 sleep 30 # 重启完成后等待三十秒,然后再次尝试一次 if ! curlit; then # 如果仍然无法访问,则: echo $(date) "Failed! Now Reboot Computer!" >> /var/log/apachemonitor.log # 写入Apache依然重启失效的日志 reboot # 重启机器(实际上重启整个伺服器是一种非常不得已的做法。本人并不建议。大家根据需要自己修改,比如简讯、邮件报警等。) fi sleep 180 fi } sleep 300 # 执行脚本后5分钟后才开始正式工作(防止重启伺服器后由于Apache还没开始启动造成误判) while true; do # 主循环体 doit > /dev/null sleep 10 done |
3、接着我们来设定一下这一「.sh」文件的权限:
1 |
chmod 755 /root/apachemonitor.sh |
4、最后,让我们把运行这一脚本的命令添加到开机启动项中,输入 vim /etc/rc.local
,然后于文件的最底部添加:
1 2 3 4 5 6 7 8 |
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. # 其它指令... sh /root/apachemonitor.sh |
5、现在 reboot
重启一下伺服器,我们的Linux就可以一直自动检测Apache(httpd)的运行状态并执行相关命令啦!