CDN,它能够提高用户对网站访问的体验。CDN一般在全国各个城市甚至国外都部署了节点,这样用户能够就近选择访问的节点,不管是在响应上仍是在带宽消耗上都会有不错的表现。但反过来讲,节点多了,那么某个节点出现问题的可能性就变大了。php
本案例需求是,监控各个CDN节点,看是否正常。具体需求:html
1)提供一个全部CDN节点IP的文本(/data/cdn_ip.list)python
2)提供一个监控连接地址(http://www.apelearn.com/test.php)linux
3)要对比节点和源站的访问结果是否一致(源节点IP为:88.88.88.88)web
4)当某个节点出问题时,须要告警发邮件给admin@admin.combash
5)每分钟执行一次脚本,告警须要作收敛,即当发现节点有故障后,当即告警,若是故障一直存在则下次告警须要在30分钟后服务器
6)本脚本不用考虑源站不正常的状况,即源站必定正常。curl
知识点一:curl命令ide
curl是一个访问http资源的命令行工具,我经常使用来测试web服务器。curl命令后面直接跟网站连接,会把访问到的内容显示在当前终端下,用法以下:函数
# curl www.baidu.com
curl命令很是实用,且用法不少,如下是curl的几个常见用法:
1)用curl下载文件:
# curl -O http://www.apelearn.com/src/logo.png
用-O能够直接把logo.png下载到当前目录,也可使用-o更改下载的文件名字:
# curl -o a.png http://www.apelearn.com/src/logo.png
2)查看header信息
# curl -l http://www.apelearn.com/src/logo.png //第一行有一个很关键的指标,200状态码,能够经过这个判断该URL是否正常。 HTTP/1.1 200 OK
3)指定代理服务器
# curl -x127.0.0.1:80 http://www.apelearn.com/src/logo.png
说明:-x后面跟的是代理服务器的IP:port,有时候为了测试某个服务器上的网站,能够用-x指定该服务器的IP,就是说这个IP不必定就是代理服务器,也能够是web服务器自己,它的做用相似于在DNS中将该域名解析到了这个IP上。除了-x选项外,还有一种方法也能够实现相似的效果,示例:
# curl -H "Host:www.apelearn.com" http://127.0.0.1/test.php
这样至关因而在127.0.0.1这台机器上访问了http://www.apelearn.com/test.php。
4)自定义referer
# curl -e "http://www.baidu.com/1.txt" http://www.apelearn.com/test.php
5)自定义user_agent
# curl -A "This is a test user_agent" http://www.apelearn.com/test.php
6)指定超时时间
# curl --connect-timeout 2 http://aaa.com/123.html //若是2秒未访问到结果,则指令结束
本案例参考脚本
#!/bin/bash #监控CDN节点 #做者: #日期: url="http://www.aminglinux.com/test.php" s_ip="88.88.88.88" ipf="/data/cdn_ip.list" mail_user=admin@admin.com #检查是否有curl命令 if ! which curl &>/dev/null then yum install -y curl fi mycurl() { curl --connect-timeout 2 -x$1:80 $url 2>/dev/null } #定义告警函数(这里的mail.py是案例二中那个脚本) m_mail() { log=$1 t_s=`date +%s` t_s2=`date -d "1 hours ago" +%s` if [ ! -f /tmp/$log ] then #建立$log文件 touch /tmp/$log #增长a权限,只容许追加内容,不容许更改或删除 chattr +a /tmp/$log #第一次告警,能够直接写入1小时之前的时间戳 echo $t_s2 >> /tmp/$log fi #不管$log文件是不是刚刚建立,都须要查看最后一行的时间戳 t_s2=`tail -1 /tmp/$log|awk '{print $1}'` #取出最后一行即上次告警的时间戳后,当即写入当前的时间戳 echo $t_s>>/tmp/$log #取两次时间戳差值 v=$[$t_s-$t_s2] #若是差值超过1800,当即发邮件 if [ $v -gt 1800 ] then #发邮件,其中$2为mail函数的第二个参数,这里为一个文件 python mail.py $mail_user "节点$1异常" "`cat $2`" 2>/dev/null #定义计数器临时文件,并写入0 echo "0" > /tmp/$log.count else #若是计数器临时文件不存在,须要建立并写入0 if [ ! -f /tmp/$log.count ] then echo "0" > /tmp/$log.count fi nu=`cat /tmp/$log.count` #30分钟内每发生1次告警,计数器加1 nu2=$[$nu+1] echo $nu2>/tmp/$log.count #当告警次数超过30次,须要再次发邮件 if [ $nu2 -gt 30 ] then python mail.py $mail_user "节点$1异常持续30分钟了" "`cat $2`" 2>/dev/null #第二次告警后,将计数器再次从0开始 echo "0" > /tmp/$log.count fi fi } mycurl $s_ip >/tmp/s.html for ip in `cat $ipf` do mycurl $ip >/tmp/$ip.html #对比源站的页面和CDN节点的页面是否有差别 diff /tmp/s.html /tmp/$ip.html > /tmp/$ip.diff 2>/dev/null n=`wc -l /tmp/$ip.diff|awk '{print $1}'` #若是有差别,那么对比结果行数确定大于0 if [ $n -gt 0 ] then m_mail $ip /tmp/$ip.diff fi done
扩展需求
监控指定页面的状态码是否为200,脚本以下:
#/bin/bash #监控指定页面是不是非200状态码 #做者: #日期: url="http://www.test.com/test.html" mail_user=admin@admin.com #检查是否有curl命令 if ! which curl &>/dev/null then yum install -y curl fi #定义告警函数(这里的mail.py是案例二中那个脚本) m_mail() { log=$1 t_s=`date +%s` t_s2=`date -d "1 hours ago" +%s` if [ ! -f /tmp/$log ] then #建立$log文件 touch /tmp/$log #增长a权限,只容许追加内容,不容许更改或删除 chattr +a /tmp/$log #第一次告警,能够直接写入1小时之前的时间戳 echo $t_s2 >> /tmp/$log fi #不管$log文件是不是刚刚建立,都须要查看最后一行的时间戳 t_s2=`tail -1 /tmp/$log|awk '{print $1}'` #取出最后一行即上次告警的时间戳后,当即写入当前的时间戳 echo $t_s>>/tmp/$log #取两次时间戳差值 v=$[$t_s-$t_s2] #若是差值超过1800,当即发邮件 if [ $v -gt 1800 ] then #发邮件,其中$2为mail函数的第二个参数,这里为一个文件 python mail.py $mail_user "$url访问异常" "`cat $2`" 2>/dev/null #定义计数器临时文件,并写入0 echo "0" > /tmp/$log.count else #若是计数器临时文件不存在,须要建立并写入0 if [ ! -f /tmp/$log.count ] then echo "0" > /tmp/$log.count fi nu=`cat /tmp/$log.count` #30分钟内每发生1次告警,计数器加1 nu2=$[$nu+1] echo $nu2>/tmp/$log.count #当告警次数超过30次,须要再次发邮件 if [ $nu2 -gt 30 ] then python mail.py $mail_user "$url访问异常持续30分钟了" "`cat $2`" 2>/dev/null #第二次告警后,将计数器再次从0开始 echo "0" > /tmp/$log.count fi fi } curl -I $url &>/tmp/curl.txt code=`grep '^HTTP/1.1' /tmp/curl.txt|awk '{print $2}'` if [ -z "$code" ] || [ $code -ne 200 ] then m_mail webcode /tmp/curl.txt fi