zabbix監控多個nginx vhost網站狀態碼

需求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 更詳細

  

 字數很少,句句精髓。但願你們能明白zabbix自動發現規則 靈活運用
相關文章
相關標籤/搜索