需求

假设一台服务器运行了N个vhost网站,如何确定在大流量并发时候找到是哪个网站的问题呢?

这似乎是每个运维都会遇到的问题,方法有很多比如:1、看nginx日志大小确定访问量。2、通过前端代理确定访问量。3、通过防火墙,waf等工具确定访问量。4、通过elk日志,splunk日志分析系统等等

这里讲一个nginx的模块利用方法:Nginx Vhost Traffic Status

添加nginx模块

添加nginx模块的方法有很多,比如  https://blog.csdn.net/zyw_java/article/details/80558320

注意生产环境不要覆盖make install

最后安装完大概是这个样子,我们要手动取得里面5xx错误条数,进行监控出图。我来做一块砖,给大家一个思路。其他的功能实现照葫芦画瓢就行。

获取他的JSON格式文件,用python解析并汇报到zabbix里

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自动发现规则 灵活运用

  

zabbix监控多个nginx vhost网站状态码的更多相关文章

  1. shell批量监控网站状态码

    shell批量监控网站状态码脚本,使用curl很慢.等我学完其他方式,在来更新. #!/bin/bash #GuoYabin yuming=`/bin/cat yuming.txt` for i in ...

  2. Nginx code 常用状态码学习小结

    最近了解下Nginx的Code状态码,在此简单总结下.一个http请求处理流程: 一个普通的http请求处理流程,如上图所示:A -> client端发起请求给nginxB -> ngin ...

  3. zabbix监控 linux/windows 主机tcp连接状态

    更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...

  4. 结合 Nginx 谈谈 Http 状态码

    [Http状态码简介] [百度百科]HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到 RFC ...

  5. zabbix监控客户端本地网络的延时状态

    配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加  Include=/etc/zabbix/zabbix_agentd.d/ 添加脚本对服务器 ...

  6. 统计nginx日志的状态码

    日志格式 61.159.140.123 - - [23/Aug/2014:00:01:42 +0800] "GET /favicon.ico HTTP/1.1" 404 \ &qu ...

  7. nginx 直接返回状态码

    server { listen 80; server_name service.aaa.com; location / { add_header Content-Type "text/pla ...

  8. 检测Nginx访问成功(状态码200)的IP及次数

    cat  access.log |awk '{print $1,$9}'|grep '200'|sort | uniq -c|awk '{print $2" "$1}'

  9. zabbix监控nginx+php-fpm,mysql+主从复制+高可用,tomcat,redis web状态

    zabbix监控对象区分 使用SNMP监控交换 使用IPMI监控服务器硬件 使用Agent监控服务器 使用JMX监控JAVA SNMP监控流程 交换机上开启snmp 在zabbix上添加监控(设置SN ...

随机推荐

  1. 【记录一个问题】铁威马NAS存储,当使用time machine备份的时候,如果再使用手机备份,会导致time machine备份中断

    如题 傻机器,无法做到并行备份!

  2. vue学习8-for循环

    <!DOCTYPE html> <html lang='en'> <head>  <meta charset='UTF-8'>  <meta ht ...

  3. 集合框架-ArrayList集合存储自定义对象

    1 package cn.itcast.p3.arraylist.test; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; ...

  4. linux中yum本地私有仓库安装搭建《全面解析》

    目录 一:yum本地仓库安装 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就 ...

  5. 打家劫舍(java语言描述(动态规划))

    题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  6. JavaScript通过父节点ID递归生成JSON树

    JavaScript通过父节点ID递归生成JSON树: · 实现思路:通过递归实现(第一次递归的时候查询出所有的父节点,然后通过当前父节点id不断地去查询所有子节点,直到递归完毕返回)   · 代码示 ...

  7. 多种方式告诉你如何计算DM同步数据到TiDB的延时时间

    背景 用户在做技术选型的过程中,总是会对一些数据指标比较关心,特别是在和竞品相比较的时候,更加需要一些有说服力的数据.基于MySQL开发的项目在迁移到TiDB的时候,使用DM同步数据是必不可少的一个环 ...

  8. STC8H开发(九): STC8H8K64U模拟USB HID外设

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. CF1229D - Wojtek and Card Tricks

    做法一 首先将排列用康托展开映射到整数,并且预处理出排列之间乘法的结果,复杂度 \(\mathcal{O}(k(k!) ^ 2)\). 枚举左端点,有可能分段的右端点至多只有 \(k!\) 个,不妨将 ...

  10. 关于IBAction、IBOutlet前缀IB的解释

    - 全称:Interface Builder - 以前的UI界面开发模式:Xcode3 + Interface Builder - 从Xcode4开始,Interface Builder已经整合到Xc ...