天天看点

zabbix应用之nginx统一监控

 “nginx统一监控”意思是在一台Linux服务器上集中监控所有nginx站点的status状态。我们把这个服务器叫做“nginx监控服务器”,可以是装有zabbix agent的zabbix server,或是其他装agent的被监控客户端。

    思路:把所有nginx站点的URL写入到“nginx监控服务器”上的一个配置文件中。增加或删除nginx监控站点只需要修改这个配置文件,利用zabbix的low-level discovery动态监控这些站点。“nginx监控服务器”的zabbix-agent调用nginx监控脚本,获取nginx_status后,利用zabbix-sender把监控数据发送到zabbix服务器端。

配置步骤如下:

一、在被监控nginx站点上配置stub_status模块

    开启stub_status模块监控,在server块中加入location就行了。

    假设“nginx监控服务器”的IP地址为192.168.0.1,配置如下:

<code>    </code><code>location </code><code>/nginx_status</code><code>{</code>

<code>        </code><code>stub_status on;</code>

<code>        </code><code>access_log off;</code>

<code>        </code><code>allow 127.0.0.1;</code>

<code>        </code><code># 要允许“nginx监控服务器”访问nginx status</code>

<code>        </code><code>allow 192.168.0.1;</code>

<code>        </code><code>deny all;</code>

<code>    </code><code>}</code>

    重启nginx,然后请求http://domain/nginx_status 就行了,下面是结果:

<code>Active connections: 1 </code>

<code>server accepts handled requests</code>

<code> </code><code>16672 16672 16769 </code>

<code>Reading: 0 Writing: 1 Waiting: 0</code>

二、在nginx监控服务器上配置监控脚本

    首先,在nginx监控服务器上安装好zabbix-agent和zabbix-sender,推荐yum安装。

    注意:设置zabbix_agentd.conf里Timeout=30。减少因脚本执行超时,agent获取不到数据的情况。

    然后,建立脚本文件的目录<code>/etc/zabbix/monitor_scripts。</code>

<code>shell</code><code># mkdir -p /etc/zabbix/monitor_scripts</code>

    把监控脚本nginx_monitor.sh放到<code>/etc/zabbix/monitor_scripts</code>目录下。

    nginx_monitor.sh脚本内容如下,需要修改AGENT_CONF变量的值:

<code>#!/bin/bash</code>

<code>#</code>

<code># Filename:    nginx_monitor.sh</code>

<code># Revision:    1.0</code>

<code># Date:        2014/09/24</code>

<code># Author:      Qicheng</code>

<code># Email:</code>

<code># Website:     http://qicheng0211.blog.51cto.com</code>

<code># Description: nginx统一监控脚本</code>

<code># Notes:       </code>

<code># 修改AGENT_CONF的值为本地zabbix agent的配置文件路径</code>

<code>AGENT_CONF=</code><code>"/etc/zabbix/zabbix_agentd.conf "</code>

<code># nginx站点的配置文件路径</code>

<code>NGINX_SITE_CONF=</code><code>"/etc/zabbix/monitor_scripts/nginx_site.conf"</code>

<code># zabbix_sender的路径</code>

<code>ZBX_SENDER=</code><code>"/usr/bin/zabbix_sender"</code>

<code>FUNCTION=$1</code>

<code>HOST_NAME=$2</code>

<code>NGINX_SITE=$3</code>

<code>CURL=</code><code>"/usr/bin/curl"</code>

<code>TIMEOUT=30</code>

<code># nginx site low-level discovery</code>

<code>function</code> <code>nginxSiteDiscovery()</code>

<code>{</code>

<code>    </code><code>nginx_site=($(</code><code>grep</code> <code>'^[^#]'</code> <code>${NGINX_SITE_CONF}))</code>

<code>    </code><code>max_index=$[${</code><code>#nginx_site[@]}-1]</code>

<code>    </code><code>printf</code> <code>'{\n'</code>

<code>    </code><code>printf</code> <code>'\t"data":['</code>

<code>    </code><code>for</code> <code>key </code><code>in</code> <code>`</code><code>seq</code> <code>-s</code><code>' '</code> <code>0 $max_index`</code>

<code>    </code><code>do</code>

<code>        </code><code>printf</code> <code>'\n\t\t{'</code>

<code>        </code><code>printf</code> <code>"\"{#NGINX_SITE}\":\"${nginx_site[${key}]}\"}"</code>

<code>        </code><code>if</code> <code>[ $key -</code><code>ne</code> <code>$max_index ];</code><code>then</code>

<code>            </code><code>printf</code> <code>","</code>

<code>        </code><code>fi</code>

<code>    </code><code>done</code>

<code>    </code><code>printf</code> <code>'\n\t]\n'</code>

<code>    </code><code>printf</code> <code>'}\n'</code>

<code>}</code>

<code># 获取nginx status,把数据发送到zabbix server</code>

<code>function</code> <code>getNginxStatus()</code>

<code>    </code><code>nginx_status_url=</code><code>"${NGINX_SITE}/nginx_status"</code>

<code>    </code><code># 获取nginx_status后,保存到下面的文件里</code>

<code>    </code><code>nginx_status_file=</code><code>"/tmp/nginx_status_$(echo ${NGINX_SITE} | sed 's#^http.*://##; s#/#_#g').log"</code>

<code>    </code><code>:&gt;</code><code>"$nginx_status_file"</code>

<code>    </code><code># curl获取nginx_status</code>

<code>    </code><code>${CURL} -s --connect-timeout ${TIMEOUT} </code><code>"$nginx_status_url"</code> <code>2&gt;&amp;1 | </code><code>tee</code> <code>"$nginx_status_file"</code>

<code>    </code><code>line_num=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>wc</code> <code>-l)</code>

<code>    </code><code># 判断是否正确获取nginx_status</code>

<code>    </code><code>[ $line_num -</code><code>ne</code> <code>4 ] &amp;&amp; { </code><code>echo</code> <code>"ERROR: $nginx_status_file is not correct."</code><code>; </code><code>exit</code> <code>1;}</code>

<code>    </code><code>active=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>grep</code> <code>'Active'</code> <code>| </code><code>awk</code> <code>'{print $NF}'</code><code>)</code>

<code>    </code><code>reading=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>grep</code> <code>'Reading'</code> <code>| </code><code>awk</code> <code>'{print $2}'</code><code>)</code>

<code>    </code><code>writing=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>grep</code> <code>'Writing'</code> <code>| </code><code>awk</code> <code>'{print $4}'</code><code>)</code>

<code>    </code><code>waiting=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>grep</code> <code>'Waiting'</code> <code>| </code><code>awk</code> <code>'{print $6}'</code><code>)</code>

<code>    </code><code>accepts=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>awk</code> <code>NR==3 | </code><code>awk</code> <code>'{print $1}'</code><code>)</code>

<code>    </code><code>handled=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>awk</code> <code>NR==3 | </code><code>awk</code> <code>'{print $2}'</code><code>)</code>

<code>    </code><code>requests=$(</code><code>cat</code> <code>"$nginx_status_file"</code> <code>| </code><code>awk</code> <code>NR==3 | </code><code>awk</code> <code>'{print $3}'</code><code>)</code>

<code>    </code><code>echo</code> <code>"Sending the data to zabbix server..."</code>

<code>    </code><code># 将特定格式的数据发送到zabbix server,每行的格式为:&lt;hostname&gt; &lt;key&gt; &lt;value&gt;</code>

<code>    </code><code>cat</code> <code>&lt;&lt; EOF | ${ZBX_SENDER} -c ${AGENT_CONF} -i -</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,active]"</code> <code>"${active}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,reading]"</code> <code>"${reading}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,writing]"</code> <code>"${writing}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,waiting]"</code> <code>"${waiting}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,accepts]"</code> <code>"${accepts}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,handled]"</code> <code>"${handled}"</code>

<code>"${HOST_NAME}"</code> <code>"nginx_status[$NGINX_SITE,requests]"</code> <code>"${requests}"</code>

<code>EOF</code>

<code>[ $</code><code># -eq 0 ] &amp;&amp; { echo "ERROR: The script needs at least one parameter."; exit 1;}</code>

<code>case</code> <code>$FUNCTION </code><code>in</code>

<code>    </code><code>nginxSiteDiscovery|getNginxStatus)</code>

<code>        </code><code>$FUNCTION</code>

<code>        </code><code>;;</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>"ERROR: Bad parameters."</code>

<code>        </code><code>exit</code> <code>1</code>

<code>esac</code>

    创建nginx站点配置文件nginx_site.conf:

<code>shell</code><code># touch /etc/zabbix/monitor_scripts/nginx_site.conf</code>

<code>shell</code><code># chown -R zabbix:zabbix /etc/zabbix/monitor_scripts</code>

    把所有被监控nginx站点的URL写入到nginx_site.conf文件中,每一行一个URL,如下图:

<a href="http://s3.51cto.com/wyfs02/M01/4A/15/wKiom1QiRf2RCGflAACIA9vwXvo605.jpg" target="_blank"></a>

    在zabbix_agentd.conf最后面添加自定义参数:

<code>UserParameter=nginxSiteDiscovery,</code><code>bash</code> <code>/etc/zabbix/monitor_scripts/nginx_monitor</code><code>.sh nginxSiteDiscovery</code>

<code>UserParameter=getNginxStatus[*],</code><code>bash</code> <code>/etc/zabbix/monitor_scripts/nginx_monitor</code><code>.sh getNginxStatus </code><code>"$1"</code> <code>"$2"</code>

    最后重启zabbix agent。

    在zabbix server端执行zabbix_get命令测试:

<a href="http://s3.51cto.com/wyfs02/M02/4A/17/wKioL1QiTd6TTqiMAAMEdIpr0fA635.jpg" target="_blank"></a>

    如上图所示,说明环境部署好了。

三、zabbix WEB端

    1、导入模板

    导入"Template App Nginx.xml"模板,附件有下载。

<a href="http://s3.51cto.com/wyfs02/M01/4A/17/wKioL1QiVXHx-YAdAAGcPqGMVhA261.jpg" target="_blank"></a>

    “get nginx status of {#NGINX_SITE}”监控项是Zabbix agent类型,用于调用脚本获取nginx_status。其他item是Zabbix trapper类型,用于接收zabbix-sender发来的nginx_status。

    模板配置了触发器,如果获取不到nginx_status则发出告警。

    2、创建nginx监控主机并链接模板

    “nginx监控主机”的配置中要填写Agent interfaces,并链接模板Template App Nginx。

<a href="http://s3.51cto.com/wyfs02/M01/4A/17/wKioL1QiVdrSUqcTAAJOp49C1RI625.jpg" target="_blank"></a>

    3、数据展示

<a href="http://s3.51cto.com/wyfs02/M01/4A/17/wKioL1QiV5HQQZ06AAewCq9WxeA362.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/4A/18/wKioL1QiYXezJTIsAAanVXgwlIg508.jpg" target="_blank"></a>

<a href="http://down.51cto.com/data/2364893" target="_blank">附件:http://down.51cto.com/data/2364893</a>

本文转自 张斌_青岛 51CTO博客,原文链接:http://blog.51cto.com/qicheng0211/1557695

继续阅读