“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>:></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>&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 ] && { </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,每行的格式为:<hostname> <key> <value></code>
<code> </code><code>cat</code> <code><< 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 ] && { 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