分析shell實現nginx反向代理後端realserver健康檢查

    今天閱讀老男孩教育博客http://oldboy.blog.51cto.com/ 中一篇關於shell實現nginx反向代理後端realserver健康檢查的文章,根據其中一個學員朋友的思路自己寫了一個腳本。


一、nginx.conf部分內容如下:

    upstream rs_pools {
    server 10.0.0.8:80 weight=5;
    server 10.0.0.9:80 weight=5;
    server 10.0.0.10:80 weight=5;
    }

    server {
        location / {
       proxy_pass http://rs_pools;
        }
    }

二、腳本如下:

#!/bin/bash

NginxConfigPath=/application/nginx/conf
NginxConfigFile=nginx.conf
NginxCheckPath=/application/nginx/html
NginxCheckFile=nginx_check.html

#通過sed和awk獲取realserver的IP地址,以數組保存
rs_list=(`sed -n '/upstream/{:a;N;/}/!ba;p}' ${NginxConfigPath}/${NginxConfigFile} | awk -F "[ :]+" '/server/{print $2}'`)

#生成html主體部分的上半部分,並生成表格的第一行
function html_static(){
cat >> ${NginxCheckPath}/${NginxCheckFile}<<EOF
<html>
<meta http-equiv="refresh" content="2">
<!-- html==>define html file-->
<body background="bg.jpg">
<!-- body==>define html file's body-->
<hr />
<!-- hr==>Create horizon line-->
<h1 align="center">Nginx Proxy Healthy Check</h1>
<!-- h1==>define the title,title range <1-6>-->
<hr />

<table width="700" border="1" align="center">
<tr bgcolor="green">
<td align="center">Server_ID</td>
<td align="center">Server_Type</td>
<td align="center">Server_IP</td>
<td align="center">Server_status</td>
</tr>
EOF
}
#生成html主體的後半部分
function html_tail(){
cat >> ${NginxCheckPath}/${NginxCheckFile}<<EOF
</table>
</body>
</html>
EOF
}

#生成表格的一行
function table_line(){
cat >> ${NginxCheckPath}/${NginxCheckFile}<<EOF
<tr bgcolor="$1"> #背景顏色
<td align="center">$2</td> #Server_ID
<td align="center">$3</td> #Server_Type
<td align="center">$4</td> #Server_Ip
<td align="center">$5</td> #Server_Status
</tr>
EOF
}

function check_rs(){
    for ((i=0;i<${#rs_list[*]};i++))
        do
        #獲取realserver的服務類型是apache還是nginx
        Server_Type=`curl -I -s ${rs_list[$i]} | awk -F "[ /]" '/Server:/{print $2}'`
        #獲取realserver返回的狀態碼
        HTTP_CODE=`curl -I -s -w "%{http_code}\n" -o /dev/null ${rs_list[$i]}`
        if [ $HTTP_CODE -eq 200 -o $HTTP_CODE -eq 301 ]
            then
            #如果返回200或者301,調用table_line函數,動態生成每一行檢測記錄
            table_line green $i ${Server_Type} ${rs_list[$i]}  UP
        else
            table_line red $i UnKnown ${rs_list[$i]}  DOWN
        fi
    done
}
#主函數
function main(){
    while true
        do
        html_static #生成html主體前面部分
        check_rs    #動態生成檢測realserver的一行,並追加到html文件
        html_tail   #把html主題的後面部分追加到html文件
        sleep 2     #檢測時間間隔
        >${NginxCheckPath}/${NginxCheckFile} #每次檢測後清空html文件,下次檢測再循環生成html文件
    done
}

main  #執行主函數

正常狀態效果如下:

wKiom1jsl_OyuwdaAAGB_xaH0gs764.jpg-wh_50

realserver服務不可用效果如下:

wKiom1jsl_WiMZRJAAGW8KpRIQo312.jpg-wh_50

倉促完成,有不對之處,請指出!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章