一、Zabbix架構
前端
zabbix是一個基於WEB界面的提供分佈式系統監視以及網絡監視功能的企業級的開源解決方案。zabbix能監視各類網絡參數,保證服務器系統的安全運營;並提供靈活的通知機制以讓系統管理員快速定位/解決存在的各類問題。java
Zabbix的運行架構以下圖所示:mysql
二、組件linux
zabbix由如下幾個組件部分構成:nginx
1)、Zabbix Server:負責接收agent發送的報告信息的核心組件,全部配置,統計數據及操做數據均由其組織進行;web
2)、Database Storage:專用於存儲全部配置信息,以及由zabbix收集的數據;sql
3)、Web interface:zabbix的GUI接口,一般與Server運行在同一臺主機上;vim
4)、Proxy:可選組件,經常使用於分佈監控環境中,代理Server收集部分被監控端的監控數據並統一發往Server端;後端
五、Agent:部署在被監控主機上,負責收集本地數據併發往Server端或Proxy端;centos
三、進程
默認狀況下zabbix包含5個程序:zabbix_agentd、zabbix_get、zabbix_proxy、zabbix_sender、zabbix_server,另一個zabbix_java_gateway是可選,這個須要另外安裝。下面來分別介紹下他們各自的做用。
zabbix_agentd
客戶端守護進程,此進程收集客戶端數據,例如cpu負載、內存、硬盤使用狀況等。
zabbix_get
zabbix工具,單獨使用的命令,一般在server或者proxy端執行獲取遠程客戶端信息的命令。一般用戶排錯。例如在server端獲取不到客戶端的內存數據,咱們可使用zabbix_get獲取客戶端的內容的方式來作故障排查。
zabbix_sender
zabbix工具,用於發送數據給server或者proxy,一般用於耗時比較長的檢查。不少檢查很是耗時間,致使zabbix超時。因而咱們在腳本執行完畢以後,使用sender主動提交數據。
zabbix_server
zabbix服務端守護進程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的數據最終都是提交到server
備註:固然不是數據都是主動提交給zabbix_server,也有的是server主動去取數據。
zabbix_proxy
zabbix代理守護進程。功能相似server,惟一不一樣的是它只是一箇中轉站,它須要把收集到的數據提交/被提交到server裏。
zabbix_java_gateway
zabbix2.0以後引入的一個功能。顧名思義:Java網關,相似agentd,可是隻用於Java方面。須要特別注意的是,它只能主動去獲取數據,而不能被動獲取數據。它的數據最終會給到server或者proxy。
四、zabbix監控環境中相關術語
主機(host):要監控的網絡設備,可由IP或DNS名稱指定;
主機組(host group):主機的邏輯容器,能夠包含主機和模板,但同一個組織內的主機和模板不能互相連接;主機組一般在給用戶或用戶組指派監控權限時使用;
監控項(item):一個特定監控指標的相關的數據;這些數據來自於被監控對象;item是zabbix進行數據收集的核心,相對某個監控對象,每一個item都由"key"標識;
觸發器(trigger):一個表達式,用於評估某監控對象的特定item內接收到的數據是否在合理範圍內,也就是閾值;接收的數據量大於閾值時,觸發器狀態將從"OK"轉變爲"Problem",當數據再次恢復到合理範圍,又轉變爲"OK";
事件(event):觸發一個值得關注的事情,好比觸發器狀態轉變,新的agent或從新上線的agent的自動註冊等;
動做(action):指對於特定事件事先定義的處理方法,如發送通知,什麼時候執行操做;
報警媒介類型(media):發送通知的手段或者通道,如Email、Jabber或者SMS等;
模板(template):用於快速定義被監控主機的預設條目集合,一般包含了item、trigger、graph、screen、application以及low-level discovery rule;模板能夠直接連接至某個主機;
前端(frontend):Zabbix的web接口
五、zabbix安裝
上篇文章咱們介紹過了在LNMP環境下 zabbix-server的安裝,所以這裏就再也不說明了,這裏簡單說明下環境規劃及zabbix-agent的安裝,操做系統都是centos6.7
兩臺服務器都安裝zabbix-agent [root@ansible ~]# wget [root@ansible ~]# rpm -ivh zabbix-release-3.0-1.el6.noarch.rpm Preparing... ########################################### [100%] 1:zabbix-release ########################################### [100%] [root@ansible ~]# yum -y install zabbix-agent
[root@ansible ~]# vim /etc/zabbix/zabbix_agentd.conf 修改配置文件
Server=172.16.80.117 #這個地址填寫zabbix-server所在的ip,默認是127.0.0.1
[root@ansible ~]# /etc/init.d/zabbix-agent start
Starting Zabbix agent: [ OK ]
六、監控第一臺主機(172.16.80.128)
zabbix配置流程基本以下
Host groups(主機組)→Hosts(主機)→Applications(監控項組)→Items(監控項)→Triggers(觸發器)→Event(事件)→Actions(處理動做)→User groups(用戶組)→Users(用戶)→Medias(告警方式)→Audit(日誌審計)
配置步驟是 configuration---->hosts---->create host
接下來選擇templates選項卡,輸入關鍵字linux,咱們選擇第一個模塊
以後咱們就能夠看到咱們剛纔添加的那臺主機172.16.80.128,紅色方框裏面是什麼意思咱們在上面已經說明相關概念了,這裏就再也不說明,過一下子就能夠出圖了
七、用戶參數User parameters
有時候當咱們監控的項目在zabbix預約義的key中沒有定義時,這時候咱們能夠經過編寫zabbix的用戶參數的方法來監控咱們要求的項目item。形象一點說zabbix代理端配置文件中的User parameters就至關於經過腳本獲取要監控的值,而後把相關的腳本或者命令寫入到配置文件中的User parameter中而後zabbix server讀取配置文件中的返回值經過處理前端的方式返回給用戶。
7.1 用戶參數的語法
UserParameter=<key>,<command>
其中UserParameter爲關鍵字,key爲用戶自定義key名字能夠隨便起,<command>爲咱們要運行的命令或者腳本。
一個簡單的例子:
UserParameter=ping,echo 1
代理程序程序將會永遠的返回1當咱們在服務器端添加item的key爲 ping時候。
稍微複雜的例子
UserParameter=mysql.ping,/usr/bin/mysqladmin -uroot -p123456 ping | grep -c alive
當咱們執行mysqladmin -uroot ping命令的時候若是mysq存活要返回mysqld is alive
,咱們經過grep–c來計算mysqld is alive的個數,若是mysql存活着個數爲1,若是不存活很明顯mysqld is alive的個數爲0,經過這種方法咱們能夠來判斷mysql的存活狀態。
對於zabbix代理程序程若是mysql存活狀態序將當返回1,若是mysql不存活狀態將返回0,當咱們在服務器端添加item的key爲mysql.ping時候。
7.2 讓key接受參數
經過讓key也接受參數的方法使item添加時更具有了靈活性,例如系統預約義key :vm.memory.size[<mode>],其中的mode模式就是用戶要接受的參數,當咱們填寫爲free時則返回的爲內存的剩餘大小,若是咱們填入的爲userd時這返回的是內存已經使用的大小。
相關語法
在/etc/zabbix/zabbix_agentd.conf中配置參數,寫法以下。
UserParameter=key,command
除了上面這種寫法,還支持參數傳遞的寫法,具體以下。
UserParameter=key[*],command $1 $2 $3 ….
描述
Key:Key的值在主機系統中必須是惟一的,其中*表明命令中接受的參數
命令:客戶端系統中可執行的命令
例1:
UserParameter=ping[*],echo $1
ping[0] - will always return '0'
ping[aaa] - will always return 'aaa'
注意:
1.用戶自定義參數必定要包含一個key和一個命令,也能夠是一個腳本
2.key在整個系統是惟一的
3.用戶自定義參數返回值,最大返回512兆
4.自定義完後,重啓服務測試Key
能夠看到該命令執行的結果是返回狀態碼200 說明網站正常
[root@ansible ~]# vim /etc/zabbix/zabbix_agentd.conf 修改客戶端配置文件 UnsafeUserParameters=1 UserParameter=http_check,/usr/bin/curl -o /dev/null -s -w %{http_code} $1 [root@ansible ~]# /etc/init.d/zabbix-agent restart Shutting down Zabbix agent: [ OK ] Starting Zabbix agent: [ OK ] 在zabbix-server測試 [root@centos02 ~]# zabbix_get -s 172.16.80.128 -p 10050 -k "http_check[172.16.80.128]"
爲監控端添加相應的item,triggers,graphs
http_check['172.16.80.128']
最後咱們來看下截圖狀況,中間咱們會模擬下httpd停掉的狀況
八、經過zabbix監控nginx的狀態 nginx配置 ###status server{ listen 80; server_name status.martin.org; location / { stub_status on; access_log off; } }
訪問測試
Activeconnections:對後端發起的活動鏈接數;
server accepts 7:nginx總共處理了29179個鏈接;
handled:成功建立了29179次握手;
requests:總共處理了34952請求。
Reading:nginx讀取客戶端的header數;
Writing: nginx返回給客戶端的header數;
Waiting: nginx請求處理完成,正在等待下一請求指令的鏈接。
編寫檢測nginx的腳本
[root@centos02 tools]# vim nginx.sh #!/bin/bash BKUP_DATE=`/bin/date +%Y%m%d` LOG="/var/log/nginx.log" HOST=status.martin.org PORT="80" # Functions to return nginx stats function active { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Active' | awk '{print $NF}' } function reading { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Reading' | awk '{print $2}' } function writing { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Writing' | awk '{print $4}' } function waiting { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } function accepts { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $1}' } function handled { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $2}' } function requests { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $3}' } # Run the requested function $1
[root@centos02 alertscripts]# cp /tools/nginx.sh /application/zabbix-server/share/zabbix/alertscripts/ [root@centos02 alertscripts]# chown zabbix.zabbix nginx.sh [root@centos02 alertscripts]# chmod +x /application/zabbix-server/share/zabbix/alertscripts/nginx.sh [root@centos02 alertscripts]# vim /etc/zabbix/zabbix_agentd.conf UserParameter=nginx.accepts,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh accepts UserParameter=nginx.handled,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh handled UserParameter=nginx.requests,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh requests UserParameter=nginx.connections.active,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh active UserParameter=nginx.connections.reading,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh reading UserParameter=nginx.connections.writing,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh writing UserParameter=nginx.connections.waiting,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh waiting [root@centos02 alertscripts]# /etc/init.d/zabbix-agent restart Shutting down Zabbix agent: [ OK ] Starting Zabbix agent: [ OK ]