zabbix监控Nginx访问⽇志中的状态码
⼀、介绍:
由于⽣产环境中Nginx访问⽇志很多,我们需要随时监控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;
输出⽇志格式如下:
root@mycentos scripts]# cat /var/log/nginx/access.log | tail -n10
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:41 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:42 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:42 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:42 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"
\"-\" \"-\" \"[18/Jul/2020:11:45:42 +0800]\" \"GET / HTTP/1.1\" \"200\" \"540\" \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win; x) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/83.0.4103.116 Safari/537.36 OPR/69.0.3686.57\" \"159.138.9.157\" \"-\" \"-\" \"0.000\" \"-\" \"159.138.9.157\"2) 创建⽇志监控脚本:
vim /usr/local/zabbix/scripts/ngx_logs.sh
#!/usr/bin/env bash
# -----------------------------------# Script name : nginx logs status code monitor# Author : xiaoyige
# Contact me : xiaoyige@qq.com# Last Modified : Jun, 18th, 2020# -----------------------------------[ ! -d /tmp/nginx ] && mkdir /tmp/nginx
LOG_PATH=/var/log/nginx/access.log #Nginx⽇志路径,根据⾃⼰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 -1000 ${LOG_PATH} | grep \"${LAST_MIN}\" > ${LOG_TEMP} #tail 1000⾏数据然后进⾏过滤上⼀分钟,如果请求量较⼤则加⼤⾏数,过滤后将数据重定向到上⼀分钟⽂件中cat ${LOG_TEMP} | awk -F '\" \"' '{print $5}' | sort | uniq -c | sort -rn > ${LOG_STAT} #过滤上⼀分钟⽂件的状态码并对状态码进⾏排序去重然后显⽰状态码次数# 备注 awk -F '\" \"' '{print $5}' 需要根据⾃⼰⽇志输出情况具体分析,#200 Code
#过滤临时⽂件中状态码等于200的值然后打印其次数后赋值给c_200,然后重定向到/tmp/nginx/nginx_200.txt,如果其值为空,则赋值为0后重定向到/tmp/nginx/nginx_200.txtc_200=`cat ${LOG_STAT} | awk '$2==200{print $1}'`;[ -z ${c_200} ] && c_200=0;echo ${c_200} > /tmp/nginx/nginx_200.txtc_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.txtc_302=`cat ${LOG_STAT} | awk '$2==302{print $1}'`;[ -z ${c_302} ] && c_302=0;echo ${c_302} > /tmp/nginx/nginx_302.txtc_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.txtc_403=`cat ${LOG_STAT} | awk '$2==403{print $1}'`;[ -z ${c_403} ] && c_403=0;echo ${c_403} > /tmp/nginx/nginx_403.txtc_404=`cat ${LOG_STAT} | awk '$2==404{print $1}'`;[ -z ${c_404} ] && c_404=0;echo ${c_404} > /tmp/nginx/nginx_404.txtc_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.txtc_503=`cat ${LOG_STAT} | awk '$2==503{print $1}'`;[ -z ${c_503} ] && c_503=0;echo ${c_503} > /tmp/nginx/nginx_503.txtc_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) 修改权限属性
如果你的zabbix使⽤zabbix⽤户进启动的按照下⾯进⾏修改权限chown -Rf zabbix.zabbix /usr/local/zabbix/scripts/ngx_logs.shchmod u+x /usr/local/zabbix/scripts/ngx_logs.sh如果zabbix是使⽤root⽤户创建的
chmod +x /usr/local/zabbix/scripts/ngx_logs.sh
创建Nginx⽇志键值
vim /etc/zabbix/zabbix_agentd.d/userparameter_ngx_logs.confUserParameter=ngx.logs[*],/usr/local/zabbix/scripts/ngx_logs.sh $1
重启zabbix-agent
systemctl resart zabbix-agent
4)测试数据获取1.本地测试数据获取
/usr/local/zabbix/scripts/ngx_logs.sh c_20028
/usr/local/zabbix/scripts/ngx_logs.sh c_2020
/usr/local/zabbix/scripts/ngx_logs.sh c_3010
/usr/local/zabbix/scripts/ngx_logs.sh c_3022
/usr/local/zabbix/scripts/ngx_logs.sh c_30414
/usr/local/zabbix/scripts/ngx_logs.sh c_4000
/usr/local/zabbix/scripts/ngx_logs.sh c_4031
/usr/local/zabbix/scripts/ngx_logs.sh c_4040
/usr/local/zabbix/scripts/ngx_logs.sh c_4050
/usr/local/zabbix/scripts/ngx_logs.sh c_5020
/usr/local/zabbix/scripts/ngx_logs.sh c_5030
/usr/local/zabbix/scripts/ngx_logs.sh c_5040
三、Zabbix_Web创建模板及监控项1)创建模板
主页点击配置 ------> 模板------>创建模板
2)创建应⽤集
3)创建监控项
进⼊模板后------->监控项-------->创建监控项
创建好后如下:
4)创建触发器
对进程监控添加触发器,触发器——》创建触发器
填⼊触发器名称,此名称是告警出的信息——》选择严重性——》添加表达式——》我这⾥是使⽤了last函数最新的值如果⼤于15则触发告警,恢复表达式为last函数最新的⾄⼩于15则恢复告警。
创建好后如下:
5)创建图形
把Nginx⽇志监控项放在图形中
6)主机嵌套模板
配置——>主机——>进⼊需要监控Nginx性能的主机——>模板——>添加模板——>选中我们创建的模板
7)查看数据
监测——》最新数据——》选中节点——》选中应⽤集
通过图形查看数据: