需求html
假設一臺服務器運行了N個vhost網站,如何肯定在大流量併發時候找到是哪一個網站的問題呢?前端
這彷佛是每一個運維都會遇到的問題,方法有不少好比:一、看nginx日誌大小肯定訪問量。二、經過前端代理肯定訪問量。三、經過防火牆,waf等工具肯定訪問量。四、經過elk日誌,splunk日誌分析系統等等java
這裏講一個nginx的模塊利用方法:Nginx Vhost Traffic Statuspython
添加nginx模塊nginx
添加nginx模塊的方法有不少,好比 https://blog.csdn.net/zyw_java/article/details/80558320web
注意生產環境不要覆蓋make installjson
最後安裝完大概是這個樣子,咱們要手動取得裏面5xx錯誤條數,進行監控出圖。我來作一塊磚,給你們一個思路。其餘的功能實現照葫蘆畫瓢就行。安全
獲取他的JSON格式文件,用python解析並彙報到zabbix裏bash
JSON路徑爲:http://域名或者ip/status/format/json服務器
爲了安全起見建議設置nginx的allow和deny
例以下面:
location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; allow 192.168.80.0/28; allow 149.60.60.0/24; deny all; } }
建立zabbix模板
在zabbix點配置>模板>建立模板>自動發現規則>建立發現規則
建立監控項原型
建立圖形原型
zabbix_agent被控端添加
UserParameter=nginx.response[*],/usr/bin/python3 /etc/zabbix/zabbix_agentd.d/GetNginxStatus.py http://192.168.80.10/status/format/json $1 UserParameter=nginx.site.discovery,/usr/bin/python3 /etc/zabbix/zabbix_agentd.d/GetNginxStatus.py http://192.168.80.10/status/format/json
這個變量學會了,能夠在zabbix web界面傳遞變量,無需每臺zabbix_agentd手動設置不一樣的url。
也能夠傳遞其餘變量,讓他不單單隻能監控5xx的錯誤信息。思路給大家了,具體實現看你能力了。
GetNginxStatus.py代碼內容以下
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Site: # @File: GetJson.py # @Author: GuoYabin # @E-mail: hbbdgyb@163.com # @Time: 12月 13, 2019 import requests import sys import json from datetime import datetime url = sys.argv[1].strip() res = requests.get(url) d = json.loads(res.text) serverZones = d['serverZones'] def connectionsinfo(): connections=d['connections'] for key,value in connections.items(): print (key,value) def uptime(): loadMsec = datetime.utcfromtimestamp(d['loadMsec'] / 1000) nowMsec = datetime.utcfromtimestamp(d['nowMsec'] / 1000) active = nowMsec - loadMsec print (active.total_seconds()) def nginxversion(): nginxversion = d['nginxVersion'] print (nginxversion) def servername(): for servername in serverZones: if servername == '*': print('\t\t{"{#SITEDOMAIN}":"'+servername+'"}') else: print('\t\t{"{#SITEDOMAIN}":"'+servername+'"},') def response(key1,key2): for servername,value in serverZones.items(): for i,v in value.items(): if servername == key2 and i == 'responses': print (v[key1]) def jsonservername(): print('{\n\t"data":[') servername() print('\t]\n}') if __name__ =='__main__': try: domain = sys.argv[2].strip() response('5xx', domain) except: jsonservername()
利用zabbix_get檢查返回值
zabbix_get命令是在server端用來檢查agent端的一個命令,在添加完主機或者觸發器後,不能正常得到數據,能夠用zabbix_get來檢查可否採集到數據,以便判斷問題癥結所在。 zabbix_get 參數說明: -s --host: 指定客戶端主機名或者IP -p --port:客戶端端口,默認10050 -I --source-address:指定源IP,寫上zabbix server的ip地址便可,通常留空,服務器若是有多ip的時候,你指定一個。 -k --key:你想獲取的key zabbix_sender是一個命令行工具,能夠用來發送Zabbix服務器處理性能數據。該工具一般用於長時間運行的用戶腳本,用於按期發送可用性和性能數據。 參數說明: -c --config <file> 配置文件絕對路徑 -z --zabbix-server <server> zabbix server的IP地址 -p --port <server port> zabbix server端口.默認10051 -s --host <hostname> 主機名,zabbix裏面配置的主機名(不是服務器的hostname),不能使用ip地址 -I --source-address <IP address> 源IP -k --key <key> 監控項的key -o --value <key value> key值 -i --input-file <input file> 從文件裏面讀取hostname、key、value 一行爲一條數據,使用空格做爲分隔符,若是主機名帶空格,那麼請使用雙引號包起來 -T --with-timestamps 一行一條數據,空格做爲分隔符: <hostname> <key> <timestamp> <value>,配合 --input-file option,timestamp爲unix時間戳 -r --real-time 將數據實時提交給服務器 -v --verbose 詳細模式, -vv 更詳細