ケース13、CDN各ノードが正常かどうかを監視する


CDNは、ユーザーがWebサイトにアクセスする体験を向上させることができます.CDNは通常、全国の各都市や海外にノードを配置し、ユーザーがアクセスするノードを近く選択できるようにし、応答的にも帯域幅消費的にも良い表現をすることができます.しかし逆に言えば,ノードが多くなると,あるノードに問題が発生する可能性が大きくなる.
このケースでは、各CDNノードを監視し、正常かどうかを確認する必要があります.具体的なニーズ:
1)すべてのCDNノードIPのテキスト(/data/cdn_ip.list)を提供する
2)監視リンクアドレス(http://www.apelearn.com/test.php)
3)ノードとソース局のアクセス結果が一致するかどうかを比較する(ソースノードIPは:88.88.88)
4)あるノードに問題が発生した場合、警告メールを送る必要がある[email protected]
5)1分間に1回のスクリプトを実行し、警告を収束させる必要があります.つまり、ノードに障害があることを発見したら、すぐに警告し、障害がずっとある場合、次の警告は30分後に行う必要があります.
6)このスクリプトは、ソース局が正常でない場合、つまりソース局が正常であることを考慮する必要はありません.
知識点1:curlコマンド
curlはhttpリソースにアクセスするコマンドラインツールで、Webサーバをテストするのによく使います.curlコマンドの後に直接Webサイトにリンクすると、アクセスしたコンテンツが現在の端末の下に表示され、次のように使用されます.
# 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)ヘッダー情報の表示
# 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)カスタムrefer
# 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"
[email protected]

#     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"
[email protected]

#     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