使用 zabbix 監控 nginx,其實是經過 nginx 自帶 status 模塊來獲取數據的,因此須要配置 ngx_status。php
啓用 nginx status 模塊,須要編譯時帶上參數 --with-http_sub_module(實際上在編譯時帶上 --with-http_stub_status_module 這個參數也是能夠顯示 nginx status的)html
配置文件中添加 nginx_status location:前端
location /nginx_status { stub_status on; access_log off; allow 192.168.0.1; deny all; }
重啓 nginx,訪問 http://localhost/nginx_status:python
Active connections: 2 #nginx 正處理的活動鏈接數2個。 server accepts handled requests 591 591 4936 # nginx啓動到如今共處理了 591 個鏈接 , 成功建立 591 次握手 通常跟第一個同樣,差值爲請求丟失數, 總共處理了 4936 次請求。 Reading: 0 #nginx 讀取到客戶端的 Header 信息數。 Writing: 1 #nginx 返回給客戶端的 Header 信息數。 Waiting: 1 #開啓 keep-alive 的狀況下,這個值等於 active - (reading + writing),意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留鏈接。這個狀態信息,從nginx啓動算起,包括重載配置文件,也會清零。
因爲監控 nginx 狀態的 key 在 zabbix agent 中並無預先定義的key,這時候咱們能夠經過編寫 zabbix 的用戶參數的方法來監控咱們要求的項目 item。形象一點說 zabbix 代理端配置文件中的 User parameters就至關於經過腳本獲取要監控的值,而後把相關的腳本或者命令寫入到配置文件中的 User parameter 中而後 zabbix server 讀取配置文件中的返回值經過處理前端的方式返回給用戶。nginx
配置/etc/zabbix/zabbix_agent.conf 語法:apache
UserParameter=<key>,<command> # 其中 UserParameter 爲關鍵字,key 爲用戶自定義 key 名字能夠隨便起,<command> 爲咱們要運行的命令或者腳本。 # 傳參數 UserParameter=key[*],command #例 UserParameter=ping[*],echo $1 ping[0] # return '0' ping[111] # return '111'
添加自定義 Userparameter 到配置文件:json
# 參數寫死 UserParameter=nginx.Accepted-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a accepted UserParameter=nginx.Active-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a active UserParameter=nginx.Handled-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a handled UserParameter=nginx.Reading-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a reading UserParameter=nginx.Total-Requests,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a requests UserParameter=nginx.Waiting-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a waiting UserParameter=nginx.Writting-Connections,/usr/local/zabbix-3.0.0/scripts/getNginxInfo.py -h 127.0.0.1 -p 80 -a writing # 變量形式 UserParameter=nginx.status[*],/usr/local/zabbix-3.0.0/scripts/ngx_status.sh $1
#!/bin/env python # # Options: # # -a active # -a accepted # -a handled # -a requests # -a reading # -a writing # -a waiting # import urllib2, base64, sys, getopt import re ## def Usage (): print "Usage: getNginxInfo.py -h 127.0.0.1 -p 80 -a [active|accepted|handled|request|reading|writing|waiting]" sys.exit(2) ## def main (): # Default values host = "localhost" port = "80" getInfo = "None" if len(sys.argv) < 2: Usage() try: opts, args = getopt.getopt(sys.argv[1:], "h:p:a:") except getopt.GetoptError: Usage() # Assign parameters as variables for opt, arg in opts : if opt == "-h" : host = arg if opt == "-p" : port = arg if opt == "-a" : getInfo = arg url="http://" + host + ":" + port + "/nginx_status/" request = urllib2.Request(url) result = urllib2.urlopen(request) buffer = re.findall(r'\d{1,8}', result.read()) ## Format: ## Active connections: 196 ## server accepts handled requests ## 272900 272900 328835 ## Reading: 0 Writing: 6 Waiting: 190 if ( getInfo == "active"): print buffer[0] elif ( getInfo == "accepted"): print buffer[1] elif ( getInfo == "handled"): print buffer[2] elif ( getInfo == "requests"): print buffer[3] elif ( getInfo == "reading"): print buffer[4] elif ( getInfo == "writing"): print buffer[5] elif ( getInfo == "waiting"): print buffer[6] else: print "unknown" sys.exit(1) if __name__ == "__main__": main()
#!/bin/bash HOST="127.0.0.1" PORT="8000" #檢查 nginx 進程是否存在 function ping { /sbin/pidof nginx|wc -l } #檢查 nginx 性能 function active { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | grep 'Active '| awk '{print $NF}' } function reading { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | grep 'Writing' | awk '{print $4}' } function waiting { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | grep 'Waiting' | awk '{print $6}' } function accepts { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | awk NR==3| awk '{print $1}' } function handled { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | awk NR==3| awk '{print $2}' } function requests { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null | awk NR==3|awk '{print $3}' } # 執行 funct $1
[root@localhost ~]# /usr/local/zabbix-3.0.0/bin/zabbix_get -s 127.0.0.1 -k 'Nginx.Accepted-Connections' 17311
導入 Template APP Nginx,並配置:bash
Apache 監控原理跟 Nginx 相同,經過 Apache 的 status 模塊獲取數據,修改配置文件:curl
# 去掉註釋 LoadModule status_module modules/mod_status.so # 末尾添加 ExtendedStatus On <location /server-status> SetHandler server-status Order Deny,Allow Deny from all Allow from 127.0.0.1 </location>
curl http://localhost/server-status 便可獲取 Apache 狀態信息;socket
php-fpm 和 nginx 同樣內建了一個狀態頁,用於瞭解 php-fpm 的狀態以及監控 php-fpm;
# cat /usr/local/php-5.5.10/etc/php-fpm.conf | grep status_path pm.status_path = /status
假設使用 Nginx 加載 PHP:
server { listen *:80 default_server; server_name _; location ~ ^/(status|ping)$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; } }
因爲 php-fpm 運行在 127.0.0.1:9000 端口上的,因此 curl http://localhost/status
pool: www process manager: dynamic start time: 14/May/2016:22:40:15 +0800 start since: 58508 accepted conn: 33 listen queue: 0 max listen queue: 8 listen queue len: 0 idle processes: 2 active processes: 1 total processes: 3 max active processes: 5 max children reached: 0 slow requests: 2091
php-fpm status詳解
pool # fpm池子名稱,大多數爲www process manager # 進程管理方式,值:static, dynamic or ondemand. dynamic start time # 啓動日期,若是reload了php-fpm,時間會更新 start since # 運行時長 accepted conn # 當前池子接受的請求數 listen queue # 請求等待隊列,若是這個值不爲0,那麼要增長FPM的進程數量 max listen queue # 請求等待隊列最高的數量 listen queue len # socket等待隊列長度 idle processes # 空閒進程數量 active processes # 活躍進程數量 total processes # 總進程數量 max active processes # 最大的活躍進程數量(FPM啓動開始算) max children reached # 大道進程最大數量限制的次數,若是這個數量不爲0,那說明你的最大進程數量過小了,請改大一點。 slow requests # 啓用了php-fpm slow-log,緩慢請求的數量
php-fpm 狀態頁比較個性化的一個地方是它能夠帶參數,能夠帶參數json、xml、html而且前面三個參數能夠分別和full作一個組合。
curl http://127.0.0.1/status?json curl http://127.0.0.1/status?xml curl http://127.0.0.1/status?html curl http://127.0.0.1/status?full
full 會多出幾個狀態:
pid # 進程PID,能夠單獨kill這個進程. You can use this PID to kill a long running process. state # 當前進程的狀態 (Idle, Running, …) start time # 進程啓動的日期 start since # 當前進程運行時長 requests # 當前進程處理了多少個請求 request duration # 請求時長(微妙) request method # 請求方法 (GET, POST, …) request URI # 請求URI content length # 請求內容長度 (僅用於 POST) user # 用戶 (PHP_AUTH_USER) (or ‘-’ 若是沒設置) script # PHP腳本 (or ‘-’ if not set) last request cpu # 最後一個請求CPU使用率。 last request memorythe # 上一個請求使用的內存