利用 MRTG 监控 Nginx 的运行状态

本文只对Linux系统。别看本文长,其实就那么几步,5个手指头都不够。只是我把原理说清楚了,大家日后好再干点厉害的。
之前成功把 NginxStatus  的 connections  数据在 Cacti 中生成曲线。
但Cacti 的运行要依靠的东西比较太多了,环境不好配是首要,再就要要跑多个PHP动态应用这对于许多站长都只有单台服务器来说可真费劲。
MRTG 因为已经延用已久,围绕它的插件也好多。把原本单一就是网卡流量监控扩展到有 CPU,内存,硬盘空间,Apache Http connections........
但不知是不是选择多,用的人少了,仿佛 MRTG 的更新已经停止了许久,连同围绕着它的插件也一块停着。很多新出的软件,都未能被其纳入“法眼”。 Nginx 就是一个例子。
好久之前已经有作者为 MRTG 量身订造了一个监控 Apache HTTP 并发数的小插件。这插件是通过获取系统中80端口的访问数来得出总的并发数,是一个小小的Perl程序。
新手或者还没弄明白,曾经为 MRTG 添加了 Apache 并发数曲线图的哥们就肯定是有印象。
首先,安装好 MRTG后,在其 *.cfg 配置文件中加入
Target[apache_conn]: `/opt/mrtg/mrtg.http`
Options[apache_conn]: gauge,nopercent,growright
Directory[apache_conn]: apache_conn
MaxBytes[apache_conn]: 4000
YLegend[apache_conn]: apache_conn
ShortLegend[apache_conn]:
LegendI[apache_conn]: apache all coonn:
LegendO[apache_conn]: apache now conn
Title[apache_conn]: apache conn
PageTop[apache_conn]:http conn

然后把以下perl代码创建为 mrtg.http 存于 mrtg 根目录中并赐予可执行权限(chmod +x mrtg.http)
#!/usr/bin/perl
$hostname=`hostname`;
$hostname=~s/\s+$//;
$apache_all_conn=`netstat -an|grep 127.0.0.1:80|wc -l`;
$apache_conn=`netstat -an|grep 127.0.0.1|grep ESTABLISHED|wc -l`;  
$apache_all_conn=~s/\n$//;
$apache_conn=~s/\n$//;
$apache_all_conn=~s/^\s+|\s+$//;
$apache_conn=~s/^\s+|\s+$//;
$gettime=`uptime|awk '{print \$1" "\$3" "\$4}'`;
$gettime=~s/\,|\n$//g;
print("$apache_all_conn\n");
print("$apache_conn\n");
print("$gettime\n");
print("$hostname\n");
以上代码就是一个负责获取系统中80端口访问数的perl小软件,加入后MRTG就会为其在HTML目录底下生成一个 apache_conn 的目录以及html跟统计图表供浏览器访问。最关键的是程序的第四跟第五行,用于获取数值。
该方法同样能用在 Nginx 上,因为一样都是80端口。
但该方法有个弊端,如果你有另外一个后端。例如 Nginx 反向代理 proxy 到后端 apache。 这时 apache 是 8080 端口的话 这么数值就有重复了。
然而,就算你使用 8181 这样的端口号来避开重复,也不是万全之计。毕竟这不是Nginx 或者 apache 原生的并发数获知方式。
Nginx 的 Status  状态页(编译时加上--with-http_stub_status_module) 才能最准确得知当前并发数。
而 相对应 Apache 其实也有相类似的 状态页,是已mod 形式加载的,在本文就不多做介绍了。
Cacti 的做法,就是通过脚本,获取到 NginxStatus 上 特定的数值转化成生成图表的数据。
而 MRTG,也行!!!之前网上找偏东南西北都没有一篇写这内容的,最后还是自己研究。今天我就要好好给大家分享分享!
就是基于修改上边 获取 appche 80端口并发数的perl小脚本。可原理不一样!
我们需要像 Cacti 那样,抓取到 NginxStatus 上特定的数值,然后给 MRTG 转化成图表。
怎么抓呢? Curl 是一个不错的选择!!! 只需在本机命令行中运行 curlhttp://127.0.0.1/NginxStatus (前提是状态页已经配上并能通过浏览器访问) 就能白字黑底地显示出浏览器打开的相同内容:
Active connections: 54 
server accepts handled requests 
60085 60085 175930 
Reading: 0 Writing: 1 Waiting: 53

好了,内容中,不单有数据,还有解析。我们的构想是! 只要数据,不要解析。而且要的还只是指定的数据。
# curl http://127.0.0.1/NginxStatus | grep Active     这样! 我们就能紧紧获取到包含有 Active 字样的内容:
Active connections: 54      
 
可还没行!我们要纯数值。
# curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'    这样!我们就能紧紧获取到内容中第三列的内容。即纯数值 :54
好了!这下就成功了一半!!生下来,我们必须把获取到的数值输入 MRTG中。于是:
curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'  > /opt/mrtg/ngx.active   把获取到的数据值输出到指定的文本,用于一会的导入,把这行命令保存为 shell 脚本,一阵子让MRTG调用。/opt/mrtg/ngx.active 是个文本文件,存放于服务器的mrtg根目录。不同配置的朋友留意其路径请自行修改。
因为 NginxStatus 中最为人关心的状态有2个,Active connections 跟 Waiting 。恰和能对上 MRTG 与生俱来 I/O 的2条曲线。
于是乎,我们的 shell 脚本就有2行:
curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'  > /opt/mrtg/ngx.active
curl http://127.0.0.1/NginxStatus |grep Waiting |awk '{print $6 }' > /opt/mrtg/ngx.waiting
保存为 nginx_status 并赐予可执行权限(chmod+x nginx_status)
然后修改perl的小程序,当然你也能像我这样,干脆把原来的复制一份,重命名为 mrtg.ngx 内容如下
#!/usr/bin/perl -w
`/opt/mrtg/nginx_status`;                                                 #调用刚才的shell脚本从 NginxStatus 中获取数值到文本。
$hostname=`hostname`;
$hostname=~s/\s+$//;
$apache_all_conn=`tail /opt/mrtg/ngx.active`;           #数值文本路径按照不同配置自行修改
$apache_conn=`tail /opt/mrtg/ngx.waiting`;               #数值文本路径按照不同配置自行修改
$apache_all_conn=~s/\n$//;
$apache_conn=~s/\n$//;
$apache_all_conn=~s/^\s+|\s+$//;
$apache_conn=~s/^\s+|\s+$//;
$gettime=`uptime|awk '{print \$1" "\$3" "\$4}'`;
$gettime=~s/\,|\n$//g;
print("$apache_all_conn\n");
print("$apache_conn\n");
print("$gettime\n");
print("$hostname\n");
然后修改 *.cfg 的配置,找到原来 apache_conn 修改路径以及各项名称,改好如下:
Target[apache_conn]: `/opt/mrtg/mrtg.ngx`                    # perl 小程序的路径
Options[apache_conn]: gauge,nopercent,growright
Directory[apache_conn]: nginx_conn                               # 生成网页的目录
MaxBytes[apache_conn]: 4000
YLegend[apache_conn]: nginx_conn                                  # 图表中的名字
ShortLegend[apache_conn]:
LegendI[apache_conn]: Active connections:                     # 图表中绿色曲线所代表的参数
LegendO[apache_conn]: Waiting:                                       # 图表中蓝色曲线所代表的参数
Title[apache_conn]:  Nginx                                                   # 图表的擡头名称
PageTop[apache_conn]:nginx                                             # 图表的页面名称

                         

等 5 分钟后,MRTG 就能在 html 目录下生成页面以及图表, 可以在浏览器中http://127.0.0.1/mrtg/apache_conn.html 访问
至此,MRTG 为 Nginx (NginxStatus) 生成图表的配置大功告成!!
 
  Max Average Current
Active connections: 188.0 B/s 51.0 B/s 132.0 B/s
Waiting: 186.0 B/s 46.0 B/s 130.0 B/s
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章