写点什么

利用 goaccess 分析 nginx 日志

用户头像
Megatron7
关注
发布于: 2020 年 05 月 06 日
利用goaccess分析nginx日志

日常运维中服务器积累了大量的 nginx 访问日志,可以利用 goaccess 分析数据。


找出一些有价值的线索。


  • 1.使用设备占比(针对优化,可以很硬气的说我们不需要优化 IE6,因为没有目标用户

  • 2.找出人群分布,优化机器向所在地部署。加速访问

  • 3.访问频率高的文件、接口,是否需要拆分

  • 4.筛选爬虫特征(过滤掉


结合现有的业务进行分析。。。


goaccess 提供了终端显示、HTML、csv 等访问数据的方式。

这里依次讲解使用细则。(安装步骤省略,请自行百度)


首先放出一张网络结构图。


生成 HTML


这里的实现思路是把分布在多台机器上的日志汇总到一起,来进行分析。

这里涉及到:logrotate、nginx access_log 配置、scp、rsyslog(放弃,依赖性比较强)、goaccess 常规命令


#!/bin/bash# 数据已脱敏LOCKNAME="/tmp/my.lock"if ( set -o noclobber; echo "$$" > "$LOCKNAME") 2> /dev/null;thentrap 'rm -f "$LOCKNAME"; exit $?' INT TERM EXIT
DATETIME=date +"%Y%m%d"PINDEX=0echo -e "\033[32m1.开始拉取各平台日志\033[0m";for i in "10.0.0.1" "10.0.0.2" "10.0.0.3"do ((PINDEX++)) scp work@$i:/nginxaccess.log-${DATETIME}.gz nginxaccess-${DATETIME}-$PINDEX.gzdone
cd goaccessecho -e "\033[32m2.开始处理日志\033[0m";
zcat nginxaccess-${DATETIME}-.gz goaccess-1.3/goaccess -p goaccess.conf -o ./nginxaccess${DATETIME}.html -
source ./nginxrequestlog.shecho -e "\033[32m3.开始同步html\033[0m";scp nginxaccess${DATETIME}.html work@10.0.0.8:/goaccessrm -rf nginxaccess-${DATETIME}
rm -f $LOCKNAMEtrap - INT TERM EXITelseecho "Failed to acquire lockfile: $LOCKNAME."echo "Held by $(cat $LOCKNAME)"exit 1fi
复制代码


这样在 10.0.0.8 机器挂上 nginx 就能访问了。


终端显示

终端显示的话就比较简单了


/usr/bin/goaccess -f access.log
复制代码



利用 webshell 也可以把内容打到 web 浏览器上,方便查看


csv 格式的运用

我们把 csv 格式的数据导出后,存进 db。这样方便对每日的数据进行归总,查询流量趋势。

当然也可以自行设计报表,方便统计。


实现上和 HTML 的处理差不多,把最终得到的 CSV 格式的数据通过脚本打到 web 应用。

进行持久化,当然纯 shell 也是可以直接操作 DB 的。


# shell中直接通过命令行导入csvload data infile '需要导入的文件全名' into table 将要导入的数据库表名 fields terminated by '列的分隔符' optionally enclosed by '"' escaped by '"' lines terminated by '回车换行符';
复制代码


# 采用shell发送http的形式是考虑到db接入层一致的问题#!/bin/bash
DATETIME=date +"%Y%m%d"DEBUG=0
if [[ $DEBUG == 1 ]];then echo 'test env' HOST='http://127.0.0.1/webserver' nginxrequestlog='nginxaccesstest.csv'else echo 'prod env' # 这里最好使用内网域名,以免机器迁移访问失效 HOST='http://10.0.0.7/webserver' nginxrequestlog='nginxaccess"$DATETIME".csv'fi

function httppost(){ curl -X POST \ $HOST \ -H 'Content-Type: application/json' \ -d "$*"}
if [ -f $nginxrequestlog ]; then str='' for line in cat $nginxrequestlog|grep requests|grep -vE "(staticrequests|general)"|awk -F '","' '{OFS=",";print $1,$2,$3,$4,$5}' do # 数据处理 done str=${str%?} str="[$str]" httppost $strelse echo 'nginxrequest_log not exists'fi
复制代码




关注公号,领取学习资料


发布于: 2020 年 05 月 06 日阅读数: 65
用户头像

Megatron7

关注

预见更多的人,听更多的故事 2018.01.05 加入

分享编程中的趣事,欢迎关注我的公号:vm-321

评论

发布
暂无评论
利用goaccess分析nginx日志