监控需求

监控Nginx常见的状态码并对其进行监控,对常见的错误状态码创建相对应的触发器
以下按照分钟对数据进行抓取

Zabbix_Agentd创建监控脚本

1)创建脚本之前核对Nginx日志格式
我这里nginx日志格式如下,使用 “” 分割日志参数。

log_format  main  ' $http_x_forwarded_for" "$remote_user" "[$time_local]" "$request"'
' "$status" "$body_bytes_sent" "$http_referer"'
' "$http_user_agent" "$remote_addr" "$gzip_ratio"'
' "$upstream_addr" "$request_time" "$upstream_response_time" "$http_host"';
access_log logs/access.log main;

2)创建日志监控脚本
vim /usr/local/zabbix/scripts/ngx_logs.sh

#!/usr/bin/env bash
# -----------------------------------
# Script name : nginx logs status code monitor
# Author : WeiLiang Xu
# Contact me : xuwl@micvs.com
# Last Modified : Jan, 06th, 2020
# ----------------------------------- [ ! -d /tmp/nginx ] && mkdir /tmp/nginx
LOG_PATH=/usr/local/nginx/logs/access.log #Nginx日志路径
LOG_TEMP=/tmp/nginx/nginx_last_min.log #Nginx上一分钟文件
LOG_STAT=/tmp/nginx/nginx_stat.txt #Nginx状态码文件
LAST_MIN=`date -d "1 minute ago" +%Y:%H:%M` #获取上一分钟值 tail -30000 ${LOG_PATH} | grep "${LAST_MIN}" > ${LOG_TEMP} #tail 3万行数据然后进行过滤上一分钟,如果请求量较大则加大行数,过滤后将数据重定向到上一分钟文件中
cat ${LOG_TEMP} | awk -F '" "' '{print $5}' | sort | uniq -c | sort -rn > ${LOG_STAT} #过滤上一分钟文件的状态码并对状态码进行排序去重然后显示状态码次数 #200 Code
#过滤临时文件中状态码等于200的值然后打印其次数后赋值给c_200,然后重定向到/tmp/nginx/nginx_200.txt,如果其值为空,则赋值为0后重定向到/tmp/nginx/nginx_200.txt
c_200=`cat ${LOG_STAT} | awk '$2==200{print $1}'`;[ -z ${c_200} ] && c_200=0;echo ${c_200} > /tmp/nginx/nginx_200.txt
c_202=`cat ${LOG_STAT} | awk '$2==202{print $1}'`;[ -z ${c_202} ] && c_202=0;echo ${c_202} > /tmp/nginx/nginx_202.txt #300 Code
c_301=`cat ${LOG_STAT} | awk '$2==301{print $1}'`;[ -z ${c_301} ] && c_301=0;echo ${c_301} > /tmp/nginx/nginx_301.txt
c_302=`cat ${LOG_STAT} | awk '$2==302{print $1}'`;[ -z ${c_302} ] && c_302=0;echo ${c_302} > /tmp/nginx/nginx_302.txt
c_304=`cat ${LOG_STAT} | awk '$2==304{print $1}'`;[ -z ${c_304} ] && c_304=0;echo ${c_304} > /tmp/nginx/nginx_304.txt #400 Code
c_400=`cat ${LOG_STAT} | awk '$2==400{print $1}'`;[ -z ${c_400} ] && c_400=0;echo ${c_400} > /tmp/nginx/nginx_400.txt
c_403=`cat ${LOG_STAT} | awk '$2==403{print $1}'`;[ -z ${c_403} ] && c_403=0;echo ${c_403} > /tmp/nginx/nginx_403.txt
c_404=`cat ${LOG_STAT} | awk '$2==404{print $1}'`;[ -z ${c_404} ] && c_404=0;echo ${c_404} > /tmp/nginx/nginx_404.txt
c_405=`cat ${LOG_STAT} | awk '$2==405{print $1}'`;[ -z ${c_405} ] && c_405=0;echo ${c_405} > /tmp/nginx/nginx_405.txt #500 Code
c_502=`cat ${LOG_STAT} | awk '$2==502{print $1}'`;[ -z ${c_502} ] && c_502=0;echo ${c_502} > /tmp/nginx/nginx_502.txt
c_503=`cat ${LOG_STAT} | awk '$2==503{print $1}'`;[ -z ${c_503} ] && c_503=0;echo ${c_503} > /tmp/nginx/nginx_503.txt
c_504=`cat ${LOG_STAT} | awk '$2==504{print $1}'`;[ -z ${c_504} ] && c_504=0;echo ${c_504} > /tmp/nginx/nginx_504.txt #以下来定义函数方便 UserParameter 调用
function c_200 {
cat /tmp/nginx/nginx_200.txt
} function c_202 {
cat /tmp/nginx/nginx_202.txt
} function c_301 {
cat /tmp/nginx/nginx_301.txt
} function c_302 {
cat /tmp/nginx/nginx_302.txt
} function c_304 {
cat /tmp/nginx/nginx_304.txt
} function c_400 {
cat /tmp/nginx/nginx_400.txt
} function c_403 {
cat /tmp/nginx/nginx_403.txt
} function c_404 {
cat /tmp/nginx/nginx_404.txt
} function c_405 {
cat /tmp/nginx/nginx_405.txt
} function c_502 {
cat /tmp/nginx/nginx_502.txt
} function c_503 {
cat /tmp/nginx/nginx_503.txt
} function c_504 {
cat /tmp/nginx/nginx_504.txt
} $1

3) 修改权限属性

chown -Rf zabbix.zabbix /usr/local/zabbix/scripts/ngx_logs.sh
chmod u+x /usr/local/zabbix/scripts/ngx_logs.sh

创建Nginx日志键值

vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_ngx_logs.conf
UserParameter=ngx.logs[*],/usr/local/zabbix/scripts/ngx_logs.sh $1

重启Zabbix_Agentd

/etc/init.d/zabbix_agentd restart

测试数据获取

1)本地测试数据获取

/usr/local/zabbix/scripts/ngx_logs.sh c_200
0
/usr/local/zabbix/scripts/ngx_logs.sh c_200
0
/usr/local/zabbix/scripts/ngx_logs.sh c_200
24
/usr/local/zabbix/scripts/ngx_logs.sh c_202
0
/usr/local/zabbix/scripts/ngx_logs.sh c_301
0
/usr/local/zabbix/scripts/ngx_logs.sh c_302
2
/usr/local/zabbix/scripts/ngx_logs.sh c_304
14
/usr/local/zabbix/scripts/ngx_logs.sh c_400
0
/usr/local/zabbix/scripts/ngx_logs.sh c_403
1
/usr/local/zabbix/scripts/ngx_logs.sh c_404
0
/usr/local/zabbix/scripts/ngx_logs.sh c_405
0
/usr/local/zabbix/scripts/ngx_logs.sh c_502
0
/usr/local/zabbix/scripts/ngx_logs.sh c_503
0
/usr/local/zabbix/scripts/ngx_logs.sh c_504
0

2)Zabbix Server进行数据获取

zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_200]"
27
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_202]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_301]"
2
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_302]"
1
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_304]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_400]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_403]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_404]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_405]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_502]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_503]"
0
zabbix_get -s 172.26.3.101 -p 10050 -k "ngx.logs[c_504]"
0

Zabbix_Web创建模板及监控项

1)创建模板
主页面点击 配置——》模板——》创建模板

2)创建应用集
应用集名称为Nginx_logs
过程略
3)创建监控项
进入模板后——》监控项——》创建监控项

最后创建好如下:

4)创建触发器
对进程监控添加触发器,触发器——》创建触发器
填入触发器名称,此名称是告警出的信息——》选择严重性——》添加表达式——》我这里是使用了last函数最新的值如果大于15则触发告警,恢复表达式为last函数最新的至小于15则恢复告警。

最后创建好如下:

5) 创建图形
我这里把Nginx日志监控的监控项都放到了图形中

主机嵌套模板

配置——》主机——》进入需要监控Nginx性能的主机——》模板——》添加模板——》选中我们创建的模板

查看数据

监测——》最新数据——》选中节点——》选中应用集

通过图形查看数据

zabbix监控nginx日志状态码的更多相关文章

  1. zabbix监控nginx连接状态(转)

    zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数) ...

  2. Zabbix监控Nginx性能状态

    Nginx在生产环境中的应用越来越广泛,所以需要对nginx的性能状态做一些监控,从而发现故障隐患,Ngnx的监控指标可分为:基本活动指标,错误指标,性能指标 监控Nginx思路: 1)首先,要想监控 ...

  3. 获取nginx日志状态码百分比脚本

    #!/bin/bash pwd=/app/nginx/logs/access.log for num1 in `cat $pwd | awk '{print $9}' | grep -Ei " ...

  4. zabbix监控nginx服务状态

    nginx需要安装--with-http_stub_status_module模块 $ nginx -V nginx version: nginx/1.12.2 built by gcc 4.8.5 ...

  5. Zabbix 监控 Nginx 状态

    简介: 如何使用 Zabbix 监控 Nginx 状态 ? 1.获取 Nginx 状态( HTTP Stub Status ) shell > /usr/local/nginx/sbin/ngi ...

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

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

  7. Zabbix 监控 Nginx(四)

    简介: 如何使用 Zabbix 监控 Nginx 状态 ? 1.获取 Nginx 状态( HTTP Stub Status ) [root@localhost ~]# /apps/product/ng ...

  8. zabbix监控nginx进程

    确认nginx有没有安装模块 然后在主站点下添加(二级站点) location /NginxStatus { stub_status on; access_log off; allow 127.0.0 ...

  9. 使用Zabbix监控Nginx服务实战案例

    使用Zabbix监控Nginx服务实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.编译安装nginx步骤详解并开启状态页 博主推荐阅读: https://www.cn ...

随机推荐

  1. JS中的offsetWidth/offsetHeight/offsetTop/offsetLeft、clientWidth/clientHeight/clientTop/clientLeft、scrollWidth/scrollHeight/scrollTop/scrollLeft

    这是一组非常容易弄混的参数!都是描述某个盒子元素的宽度.高度以及上或左的距离偏移量. 1. offsetWidth / offsetHeight(不包括外边距) offsetWidth:返回元素的宽度 ...

  2. 09-sass

    一.sass和scss sass最初是为了配合haml设计的,不需要大括号,用tab缩进 从第三代开始,保留缩进风格,完全向下兼容普通的css代码 二.下载配置sass compass是sass的一个 ...

  3. L12 Transformer

    Transformer 在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs).让我们进行一些回顾: CNNs 易于并行化,却不适合捕捉变长序列内的依赖关 ...

  4. 最长上升子序列 HDU 1025 Constructing Roads In JGShining's Kingdom

    最长上升子序列o(nlongn)写法 dp[]=a[]; ; ;i<=n;i++){ if(a[i]>dp[len]) dp[++len]=a[i]; ,dp++len,a[i])=a[i ...

  5. 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

    在我的上一篇文章中,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务.不幸的是,由于Quartz.NET API的工作方式,在Quartz作业中使用 ...

  6. Os-hackNos-1靶机过关记录

    靶机地址:172.16.1.198(或112)  kali地址:172.16.1.108 1 信息收集 靶机界面如下 简单查看 OS:Ubuntu Web:Apache2.4.18 尝试端口扫描 开放 ...

  7. Java工作流引擎-集团模式下的权限 设计与实现

    关键字 工作流开发框架权限设计.用户组.岗位.集团模式应用. java工作流程引擎, .net 工作流引擎,工作流开发框架 相关的表结构 -- 相关组织-表结构. SELECT No,Name,Par ...

  8. 使用dynamic 和MEF实现轻量级的 AOP 组件 (1)

    转载https://www.cnblogs.com/niceWk/archive/2010/07/19/1780843.html AOP魔法 今天你AOP了吗?谈到AOP,总有一种神秘的感觉,人类对于 ...

  9. 聊聊Spring Boot Actuator

    概述 在本文中,我们将介绍Spring Boot Actuator.我们将首先介绍基础知识,然后详细讨论Spring Boot 1.x和2.x中的可用内容. 我们将在Spring Boot 1.x中学 ...

  10. java学习(第四篇)数组

    一.一维数组 1.声明,分配内存 int[] a=new int[10]; 数组元素的数据类型 [] 数组名=new 类型 [数组元素个数]: 2.初始化 int[] a=new int[] {1,2 ...