致敬母校:老男孩Linux培训(只培养IT精英)

老男孩老师博客地址:

这是在学习Nginx反向代理的一道考试题,内容如下:

开发监控Nginx RS节点状态的插件,通过Web界面展示(接近实时2秒刷新1次),宕机的节点颜色设置为红色,正常节点颜色为绿色。

Shell代码如下:

#!/bin/bash

#后端RS节点IP

rsip=(

10.0.0.9

10.0.0.10

)

refreshtime=2 #浏览器客户端自动刷新间隔时间

idletime=2 #脚本执行间隔时间

statushtml=/usr/local/nginx/html/status.html #生成的HTML文件

#增加Table标签

function addTable() {

    cat >${statushtml}<<EOF

<html>

<head>

    <meta http-equiv="refresh" content="$refreshtime"> #浏览器客户端自动刷新间隔;

    <title>RS Status</title>

</head>

<body>

    <table border="1" width="25%">

        <tr>

            <td>Host</td>

            <td>Type</td>

            <td>Status</td>

        </tr>

EOF

}

#增加RS节点状态信息

function addContent() {

    cat >>${statushtml}<<EOF

        <tr>

            <td>$1</td>

            <td>$2</td>

            <td style="background:$3;">$4</td>

        </tr>

EOF

}

#增加HTML结尾

function addEnding() {

    cat >>${statushtml}<<EOF

    </table>

</body>

</html>

EOF

}

while true

do

    addTable

    for ((i=0;i<`echo ${#rsip[*]}`;i++))

    do

        ip=${rsip[$i]}

        httptype=$(curl -s -I http://${ip} | grep 'Server' | awk -F '[ /]' '{print $2}') #获取Web软件名称

        color="red"

        serverstatus="Down"

        httpcode=$(curl -o /dev/null -s -w %{http_code}  #获取RS返回的状态码

        if [ $httpcode == '200' ]

        then

            color="green"

            serverstatus="OK"

        fi

        if [ -z $httptype ]

        then

            httptype="Unknown"

        fi

        addContent $ip $httptype $color $serverstatus

    done

    addEnding

    sleep $idletime

done

小结:

1、由于略懂HTML语法,生成的HTML页面有待优化;

2、此脚本仅供参考,有更智能的方法,参考nginx_upstream_check_module;

3、可以增加一个邮件报警功能;

4、此脚本如有不对的地方,请指正;