shell: 开发shell脚本检查Nginx实战分享

shell scott 279℃ 0评论

开发shell脚本检查Nginx实战分享

一、本脚本实现功能:

1、自动检查Nginx下面的代理节点是否正常

2、通过页面显示状态,有问题的节点给出页面报警及声音报警。

3、增加新节点,页面自动载入新节点,无需修改程序。

二、守护检查脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[root@lb01 extra]# cd /server/scripts/
[root@lb01 scripts]# vi nginx_check.sh
#!/bin/bash
# oldboy training 21 zhangyao
# Defined variables
NginxDir=/application/nginx
ExtraPath=$NginxDir/conf/extra
ScriptDir=/server/scripts
StatusLog=$ScriptDir/status.log
StatusHtml=$NginxDir/html/status/status.html
StatusHtmlOri=$NginxDir/html/status/status.html.ori
# Judge some files
[ -d $NginxDir ] ||exit 1
[ -d $ScriptDir ] ||mkdir -p $ScriptDir
[ -f $StatusLog ] ||touch $StatusLog
[ -f $StatusHtml ] ||touch $StatusHtml
# Defined Check URL Functions
function check_url(){
    status=`curl -s $2/check.html`
    if [ "$status>" == "OK>" ]
      then
         echo "$1 $2 up>" >>$StatusLog
    else
         echo "$1 $2 down>" >>$StatusLog
    fi
}
# Defined List URL and Check Functions
function check(){
    >$StatusLog    
    cd $ExtraPath  
    for file in `ls`  #首先遍历extra目录下的所有文件,然后遍历每个文件的IP行,将参数传给check_url
      do
        url=(`awk -F "[ ]+>" '/server/ {print $3}' $file`)
        for i in ${url[*]}
          do
    check_url $file $i
        done
    done
}
# Defined Html Table Format Functions
function table(){  #将表格的一行语句累加后一次性插入html文件
    char="<tr bgcolor=>"$1"><th>$2</th><th>$3</th><th>$4</th><th>$5</th></tr>>"
    sum="$sum>""$char>"
}
function html(){
    Index=1  #表格最左侧的一列,初始值为1
    flag=0
    sum=">"   #行语句初始值null
    /bin/cp $StatusHtmlOri $StatusHtml  #将status html文件初始化
    while read line  #一行行读入$StatusLog文件,格式为dynamic_pools 10.0.0.6:80 up
       do
         array_line=($line)
         if [ "${array_line[2]}>" == "up>" ]
           then
             table "#90EE90>" $Index ${array_line[*]} #将颜色参数、index值及其他参数传给table函数
         else
         table "#FF0000>" $Index ${array_line[*]}
         ((flag++)) #down情况下flag会计数
         fi
         ((Index++))
    done<$StatusLog
    [ $flag -eq 0 ] ||  #如果flag不为0,肯定有down机器,增加一个语音报警的功能,仿照zabbix
        sum=$sum"<audio id=>"clickSound" autoplay=>"autoplay"><source src=>"warning.mp3" type=>"audio/mpeg"></audio>>"
    sed -i "/C0C0C0/a $sum>" $StatusHtml  #将sum语句插入html文件
}
# Defined Main Functions
function main(){
    while true
      do
        check
        html
        sleep 5
    done
}
main

三、相关文件

status.html.ori

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!doctype html>
<html>
<head>
<meta charset="utf-8>">
<meta http-equiv="refresh>" content="5>">
<title>Nginx http upstream check status</title>
</head>

<body>
<div align="center>">
  <table width="1171>" height="682>" border="1>">
    <tr>
      <td background="20150516194115.jpg>" ><table align="center>" style="background-color:white>" cellspacing="0>" cellpadding="3>" border="1>">
  <tr bgcolor="#C0C0C0>"><th>Index</th><th>Upstream</th><th>Name</th><th>Status</th></tr></td>
    </tr>
  </table>
</div>
</body>
</html>

status.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!doctype html>
<html>
<head>
<meta charset="utf-8>">
<meta http-equiv="refresh>" content="5>">
<title>Nginx http upstream check status</title>
</head>
<body>
<div align="center>">
  <table width="1171>" height="682>" border="1>">
    <tr>
      <td background="20150516194115.jpg>" ><table align="center>" style="background-color:white>" cellspacing="0>" cellpadding="3>" border="1>">
  <tr bgcolor="#C0C0C0>"><th>Index</th><th>Upstream</th><th>Name</th><th>Status</th></tr></td>
<tr bgcolor=#90EE90><th>1</th><th>dynamic_pools</th><th>10.0.0.6:80</th><th>up</th></tr><tr bgcolor=#90EE90><th>2</th><th>static_pools</th><th>10.0.0.5:80</th><th>up</th></tr><tr bgcolor=#90EE90><th>3</th><th>static_pools</th><th>10.0.0.6:80</th><th>up</th></tr>
    </tr>
  </table>
</div>
</body>
</html>

四、nginx.conf站点配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include    mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/static_pools;
    include extra/dynamic_pools;
    server {
        listen     80;
        server_name   www.etiantian.org;
        location / {
        if ($http_user_agent ~* "MSIE>")
          {
             rewrite ^/ http://10.0.0.6/ie.html;  
          }
            root   html;
            index  index.html index.htm;
        }
       location /image/ {
        proxy_pass  http://static_pools;
        include proxy.conf;
       }
       location /dynamic/ {
        proxy_pass  http://dynamic_pools;
        include proxy.conf;
       }
    }
}
extra/dynamic_pools包含文件
upstream dynamic_pools {
    server 10.0.0.6:80 weight=5;
}
extra/static_pools包含文件
upstream static_pools {
    server 10.0.0.5:80 weight=5;
    server 10.0.0.6:80 weight=5;
}

站点下健康检查文件:check.html

ok

五、效果

正常状态效果:

shell: 开发shell脚本检查Nginx实战分享

shell: 开发shell脚本检查Nginx实战分享

报警效果节点故障条目变红,并且有声音报警(也可以实现邮件、短信报警)

shell: 开发shell脚本检查Nginx实战分享

shell: 开发shell脚本检查Nginx实战分享

谢谢大家!本文内容来自21期学员张耀!

原文:http://oldboy.blog.51cto.com/2561410/1656844

转载请注明:osetc.com » shell: 开发shell脚本检查Nginx实战分享

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址