今天阅读老男孩教育博客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}<






Nginx Proxy Healthy Check





Server_ID
Server_Type
Server_IP
Server_status

EOF
}
#生成html主体的后半部分
function html_tail(){
cat >> ${NginxCheckPath}/${NginxCheckFile}<


EOF
}

#生成表格的一行
function table_line(){
cat >> ${NginxCheckPath}/${NginxCheckFile}< #背景颜色
$2 #Server_ID
$3 #Server_Type
$4 #Server_Ip
$5 #Server_Status

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  #执行主函数

正常状态效果如下:

分析shell实现nginx反向代理后端realserver健康检查_第1张图片

realserver服务不可用效果如下:

仓促完成,有不对之处,请指出!!!