“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