笔者在通过web界面展现由自定义脚本统计各http(按照http访问路径分类)服务在特定时间周期的访问量的项目中,通过zabbix trapper设置和自定义shell脚本相结合的方式实现了统计和展现需求,有如下两个特点:
性能高
平均统计上百万行日志耗时并发送到zabbix server后通过web 界面展现出来耗时在4秒内
可扩展性高
可以根据不同时间周期统计;可以根据策略筛选不同的服务进行统计;
最近遇到部分服务不稳定,需要判断是访问量过高,还是服务自身的问题导致的,对该类型服务的客户端访问量进行统计和分析就提上了日程,通过自定义脚本按照一定时间周期统计本周期内各个http访问(一级目录分类)nginx日志,不同目录对应不同功能,从而实现了应用各功能模块的访问量统计。
开发和运营人员查看方便
通过web界面展现,再辅以权限控制可以完美解决该需求。
性能要好
统计功能不能占用过高的cpu和内存、磁盘等资源,因为都是线上机器。
历史记录追溯
统计记录需要有保存时限,通常为一年,一年内的历史数据方便查看和对比。
zabbix具有很强大功能及易用的图形界面完全满足界面展示、历史记录追溯查看、权限控制等需求自定义shell脚本完成日志的采集和统计完全满足关于性能方面的要求
环境说明
zabbix
- zabbix server 3.2.4
- zabbix agent 2.4.7
- zabbix_sender 2.4.7
主机
- centos7
- bash
nginx
- nginx version: nginx/1.12.0
- 标准日志格式
自定义shell脚本采集和统计日志
日志格式
- http
117.61.128.188 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.009 uct="0.000" uht="0.009" urt="0.009"117.61.129.158 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cnn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.011 uct="0.000" uht="0.011" urt="0.011"117.61.134.167 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.008 uct="0.000" uht="0.008" urt="0.008"
- tcp
117.61.132.69 [06/Jun/2017:13:20:00 +0800] TCP 200 55 30 0.023 "10.0.1.21:59001" "30" "55" "0.000" 117.61.132.69 13655 10.0.1.12 59001115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59001" "0" "0" "0.000" 115.159.128.92 11792 10.0.1.12 59001115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59002" "0" "0" "0.000" 115.159.128.92 41148 10.0.1.12 59002115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59003" "0" "0" "0.000" 115.159.128.92 32925 10.0.1.12 59003
脚本
#!/bin/shaccess_log=/var/log/nginx/your_nginx.logtcp_log=/var/log/nginx/your_tcp_access.logsendkeys="trip tripWeb tripWeixin 59001 59002 59003"cur_time=`date +%d/%b/%Y:%H:%M:%S`if [ $1 ] ; then time_dur=$1else time_dur=5fiago_time=`date -d "$time_dur minutes ago" +%d/%b/%Y:%H:%M:%S`# for debugging#echo $cur_time $ago_timetemp_file=/tmp/count_$time_dur_mins.tmpcount_by_name() { # http awk -F' |?' '{if((substr($4,2,20)>=start)&&(substr($4,2,20)<=end)){split($8,aa,"/");name[aa[2]]=aa[2];cnt[aa[2]]+=1}}END{for(i in name)print name[i],cnt[i]}' start=$ago_time end=$cur_time $access_log >>$temp_file # tcp awk -F' |"' '{if((substr($2,2,20)>=start)&&(substr($2,2,20)<=end)){s[$10]=$10;cnt[$10]+=1}}END{for(i in s)print s[i],cnt[i]}' start=$ago_time end=$cur_time $tcp_log |awk -F' |:' '{print $2,$3}' >>$temp_file}send_to_server() { while read name count do #echo $name $count #echo $sendkeys if [[ "$sendkeys" =~ "$name" ]] ; then echo $name $count zabbix_sender -z 10.0.1.2 -s `hostname` -k $name -o $count fi done < $temp_file}count_by_namesend_to_server:>$temp_file
脚本运行输出及注意事项
- 示例
./nginx_by_name.sh 10 #10分钟统计,假设如下统计结果system 676authorityManage 116cdcGraph 712favicon.ico 7cdcMessageQueue 76
-
注意事项
system为发送给zabbix server的Key,需要保持同创建item的Key一致;
676为该Key的值;
zabbix_sender中的hostname命令返回值必须同zabbix frontend中定义的主机中的Host name内的值保持一致
zabbix相关设置过程
创建模板
登录后,步骤:Configuration->Templates->Create template->输入模板免费精选名字大全”nginxbydir”保存 贴图略
创建项目
步骤:Configuration->Templates->点击 nginxbydir模板的Items->进入items设置->点击右上角的Create item ->输入Name、选择Type为Zabbix trapper、输入Key->依次创建所需的items
设置主机使用该模板
zabbix_sender测试
crontab设置
总结
至此,应该可以满足
存在问题
- 考虑统计数据的时候某个目录访问次数为0的话,如果发送数据0给zabbix server
- 考虑多个主机数据汇总的图形展示
—-想了解更多的网站安全相关处理怎么解决关注<计算机技术网(www.ctvol.com)!!>
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/webstt/websy/98930.html