实现功能介绍:
利用shell程序及http服务巧妙的实现监控nginx代理节点状态检查,然后通过web界面实时刷新显示结果,是不是有些吃惊这样高大上的程序?那就赶紧看看吧!
to用人单位:此课程可以体现学生shell编程功力,以及对nginx proxy企业实战及驾驭的能力。
不同的同学的三个实现方法分享,各位看官,你们看看哪个同学的更好,请评论。
第一个实现脚本:youjinyi 视频下载看地址:http://down.51cto.com/data/1914201
#!/bin/sh
port=80
conf_path="/application/nginx/conf"
conf_file="nginx.conf"
html_path="/application/nginx/html"
html_file="monitor.html"
RS=($(grep WEB-A "$conf_path/$conf_file"|grep -v ‘#‘|awk -F"[ :]+" ‘{print $2}‘))
function proxy_delRs()
{
local ip=$1
sed -i ‘/‘$ip‘/s/\(.*\);/\1 down;/g‘ "$conf_path/$conf_file" &> /dev/null
[ $? -eq 0 ] && return 0 || return 1
}
function proxy_addRs()
{
local ip=$1
sed -i ‘/‘$ip‘/s/\(.*\)down;/\1;/g‘ "$conf_path/$conf_file" &> /dev/null
[ $? -eq 0 ] && return 0 || return 1
}
function proxy_getWebServerType()
{
local ip=$1
local srvType=$(curl -I -s $ip|awk ‘/^Server/{print $2}‘|cut -b1-5)
if [ "$srvType" == "Apach" ];then
return 1
elif [ "$srvType" == "nginx" ];then
return 0
else
return 2
fi
}
function proxy_getRsStatus()
{
local ip=$1
if cat $conf_path/$conf_file|grep "$ip:$port\(.*\)down;" &>/dev/null;then
return 0
else
return 1
fi
}
function proxy_checkRsHealth()
{
local ip=$1
if [ "$(nmap $ip -p $port|awk ‘/80/{print $2}‘)" == "open" ];then
return 0
else
return 1
fi
}
function proxy_checkHtml()
{
if [ ! -f "$html_path/$html_file" ];then
proxy_htmlInit
fi
}
function proxy_sendStatToHtml()
{
local rs=$1
local string=$2
if [ $string == "Good" ];then
sed -i /‘<td id=‘${rs}‘_stat‘/s#.*#‘ <td id=‘$rs‘_stat align="center" bgcolor="green"> Good </td>‘#g $html_path/$html_file &>/dev/null
else
sed -i /‘<td id=‘${rs}‘_stat‘/s#.*#‘ <td id=‘$rs‘_stat align="center" bgcolor="red"> Bad </td>‘#g $html_path/$html_file &>/dev/null
fi
proxy_getWebServerType $rs
case $? in
0)
sed -i /‘<td id=‘${rs}‘_type‘/s#.*#‘ <td id=‘${rs}‘_type align="center"> Nginx </td>‘#g $html_path/$html_file &>/dev/null
;;
1)
sed -i /‘<td id=‘${rs}‘_type‘/s#.*#‘ <td id=‘${rs}‘_type align="center"> Apache </td>‘#g $html_path/$html_file &>/dev/null
;;
2)
sed -i /‘<td id=‘${rs}‘_type‘/s#.*#‘ <td id=‘${rs}‘_type align="center"> Unknow </td>‘#g $html_path/$html_file &>/dev/null
;;
*)
;;
esac
}
function proxy_htmlInit()
{
echo ‘<html>
<head><h4 align="center"><font size="14" style="color:grey"> Cluster Web Service Health Check</front></h4>
<meta http-equiv="refresh" content="1">
<style>
tr,td{font-size:28px;
}
</style>
</head>
<body>
<table border=1 align="center">
<tr size=20>
<td bgcolor="Cyan" align="center"> Real Server Type </td>
<td bgcolor="Cyan" > Real Server Host </td>
<td bgcolor="Cyan" align="center"> Real Server Status </td>
</tr>‘ > $html_path/$html_file
for rs in ${RS[@]}
do
proxy_getWebServerType $rs
case $? in
0)
echo ‘ <tr size=20>
<td id=‘${rs}_type‘ align="center"> Nginx </td>
<td align="center"> ‘$rs‘ </td>‘ >> $html_path/$html_file
;;
1)
echo ‘ <tr size=20>
<td id=‘${rs}_type‘ align="center"> Apache </td>
<td align="center"> ‘$rs‘</td>‘ >> $html_path/$html_file
;;
2)
echo ‘ <tr size=20>
<td id=‘${rs}_type‘ align="center"> Unknow </td>
<td align="center"> ‘$rs‘</td>‘ >> $html_path/$html_file
;;
*)
;;
esac
if proxy_checkRsHealth $rs;then
echo ‘ <td id=‘${rs}_stat‘ align="center" bgcolor="green"> Good </td>
</tr>‘ >> $html_path/$html_file
else
echo ‘ <td id=‘${rs}_stat‘ align="center" bgcolor="red"> Bad </td>
</tr>‘ >> $html_path/$html_file
fi
done
echo ‘ </table>
</body>
</html>‘ >> $html_path/$html_file
}
function proxy_checkHealthHandler()
{
proxy_checkHtml
for rs in ${RS[@]}
do
if proxy_checkRsHealth $rs;then
if proxy_getRsStatus $rs;then
proxy_addRs $rs
proxy_sendStatToHtml $rs "Good"
fi
else
if ! proxy_getRsStatus $rs;then
proxy_delRs $rs
proxy_sendStatToHtml $rs "Bad"
fi
fi
done
}
function main()
{
proxy_htmlInit
while true
do
proxy_checkHealthHandler
sleep 1
done
}
main第二个同学实现脚本:王硕 下载看讲解视频地址:http://down.51cto.com/data/1914011
#!/bin/bash
#Author: Stanley Wang
#mail:
#Version: 1.0
#Description: This is a script for nginx proxy health check.
#
###def vars##########
RS=(
172.16.1.191
172.16.1.192
)
PORT=80
html_file="/var/html/www/index.html"
declare -a RSTATUS
###main##############
function checkrs(){
local I=0
for ((I=0;I<${#RS[*]};I++))
do
RSTATUS[$I]=`nmap ${RS[$I]} -p $PORT|grep "open"|wc -l`
done
}
function output(){
if [ ${RSTATUS[0]} -eq 0 ];then
#echo "${RS[$i]} is down!"
sed -i ‘22 s/.*/<td align="center" bgcolor="red"><font size="15">Down!<\/font><\/td>/g‘ $html_file
elif [ ${RSTATUS[0]} -eq 1 ];then
#echo "${RS[$i]} is OK!"
sed -i ‘22 s/.*/<td align="center" bgcolor="green"><font size="15">OK!<\/font><\/td>/g‘ $html_file
fi
if [ ${RSTATUS[1]} -eq 0 ];then
#echo "${RS[$i]} is down!"
sed -i ‘28 s/.*/<td align="center" bgcolor="red"><font size="15">Down!<\/font><\/td>/g‘ $html_file
elif [ ${RSTATUS[1]} -eq 1 ];then
#echo "${RS[$i]} is OK!"
sed -i ‘28 s/.*/<td align="center" bgcolor="green"><font size="15">OK!<\/font><\/td>/g‘ $html_file
fi
}
while true
do
checkrs
output
sleep 2
done第三个实现脚本:刘磊 下载看讲解视频:http://down.51cto.com/data/1914011
#!/bin/bash
rs_arr=(
10.0.0.11
10.0.0.22
10.0.0.33
)
file_location=/var/html/test.html
function web_result {
rs=`curl -I -s $1|awk ‘NR==1{print $2}‘`
return $rs
}
function new_row {
cat >> $file_location <<eof
<tr>
<td bgcolor="$4">$1</td>
<td bgcolor="$4">$2</td>
<td bgcolor="$4">$3</td>
</tr>
eof
}
function auto_html {
web_result $2
rs=$?
if [ $rs -eq 200 ]
then
new_row $1 $2 up green
else
new_row $1 $2 down red
fi
}
main(){
while true
do
cat >> $file_location <<eof
<h4>he Status Of RS :</h4>
<meta http-equiv="refresh" content="1">
<table border="1">
<tr>
<th>NO:</th>
<th>IP:</th>
<th>Status:</th>
</tr>
eof
for ((i=0;i<${#rs_arr[*]};i++)); do
auto_html $i ${rs_arr[$i]}
done
cat >> $file_location <<eof
</table>
eof
sleep 2
> $file_location
done
}
main本文来自老男孩教育19期学生课后作业分享。
本文出自 “老男孩linux运维” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/1589685
原文地址:http://oldboy.blog.51cto.com/2561410/1589685