天天看點

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

繼續閱讀