案例十3、監控CDN各節點是否正常

CDN,它能夠提高用戶對網站訪問的體驗。CDN一般在全國各個城市甚至國外都部署了節點,這樣用戶能夠就近選擇訪問的節點,不管是在響應上仍是在帶寬消耗上都會有不錯的表現。但反過來講,節點多了,那麼某個節點出現問題的可能性就變大了。php

本案例需求是,監控各個CDN節點,看是否正常。具體需求:html

1)提供一個全部CDN節點IP的文本(/data/cdn_ip.list)python

2)提供一個監控連接地址(http://www.apelearn.com/test.phplinux

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
相關文章
相關標籤/搜索