今天閱讀老男孩教育博客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 #執行主函數
正常狀態效果如下:
倉促完成,有不對之處,請指出!!!