星图导航
首页 文章 排行榜 申请收录 友链申请 关于
首页 / 文章资讯 / 网站运营 / 命令行看流量:GoAccess实时日志分析

命令行看流量:GoAccess实时日志分析

星图导航配图

装了统计代码之后,页面上的数字看着挺舒服,但一旦出问题,你只知道“今天掉了”,不知道是谁在什么时候访问了哪个页面、从哪儿来的。这些细节全在 nginx 的访问日志里,只是默认格式没法直接看。GoAccess 就是把这个日志变成一个能交互查看的报表。

为什么还要看原始日志

统计工具给你的都是聚合结果,PV 多少、UV 多少、来源渠道分布。它不告诉你单个请求的情况,比如有没有人在一分钟内刷了一百次同一个页面。

排查的时候真正有用的是明细。某个 IP 反复请求不存在的地址,某个爬虫把带宽跑满,某个页面返回了 502,这些原始日志里都写着,统计面板上看不出来。

访问日志还记录 UA 和 referer,能看出对方用的什么浏览器、从哪个网站跳过来的。做内容的人最关心的就是这一条。

所以统计工具和原始日志不是二选一,两个都要。前者看趋势,后者查具体案子。

装一条命令就够

Debian 系直接 apt install goaccess,CentOS 系用 yum 或者编译安装。版本别太老,太老的版本解析 nginx 默认格式会出错。

装完先确认它能识别你的日志格式。nginx 默认的 combined 格式 GoAccess 内置支持,直接指定 --log-format=COMBINED 就能解析。如果你在 nginx 里自定义了 log_format,要用对应的格式串去告诉它。

格式串写错的表现是解析出来的字段全是空的或者乱码。先拿日志的前几行试,能正确解析出时间、地址、状态码再往下走。

日志文件路径要写对。宝塔的站点日志一般在 /www/wwwlogs/域名.log,不是 .error.log,别搞混了。

第一条命令怎么跑

最直观的用法是生成一个静态 html 报告,然后用浏览器打开看。命令大概是 goaccess 日志文件 -o report.html --log-format=COMBINED,几秒钟就出来。

报告页面里有十几个面板:访问量趋势、请求的文件、静态资源、访客来源国家、浏览器、操作系统、爬虫、状态码分布、访问时间分布,基本覆盖了你想知道的全部。

如果日志很大,第一次跑会慢一些。几百兆的日志大概一两分钟,属于正常。

生成的 html 是自包含的,样式和脚本都嵌在里面,拷到本地双击就能看,不用起服务。这一点很适合临时排查。

三个最实用的查询

第一个看状态码。面板里会列出 404 和 5xx 的具体地址,哪个页面在报错一目了然。404 特别多的地址,要么是链接写错了,要么是文章删了但外链还在。

第二个看爬虫。它会按 UA 分类,百度、必应、谷歌各抓了多少次,抓的是哪些地址。做 SEO 的人天天看这个,能判断收录进度。

第三个看来源。referer 面板会告诉你访客从哪些站跳过来。全是直接访问说明没有外部引流,来源集中在几个站说明那几个外链在起作用。

这三个面板基本能回答运营上八成的问题,剩下的细节再去翻原始日志。

实时模式,盯着看

加一个参数就能变成实时刷新,终端里直接显示面板,每隔几秒更新一次。命令是 goaccess 日志文件 --log-format=COMBINED,不带 -o 就进交互模式。

实时模式最大的用处是在做活动或者发文章的时候盯着。发完一篇看有没有人进来、从哪来的、有没有报错,反馈是即时的。

终端界面支持键盘操作,按数字切面板,按 q 退出。习惯之后比开网页快。

注意实时模式是一直跑着的,日志在增长它就在读。看完记得退出,别挂在后台占资源。

日志轮转之后怎么办

nginx 默认每天或者按大小切日志,切完之后旧的变成 .gz。GoAccess 读不了压缩文件,要先 zcat 解压再喂给它,或者用管道把解压结果传进去。

想统计一段时间的总量,把所有相关的日志按顺序传给它:zcat 旧日志.gz 新日志 | goaccess - --log-format=COMBINED -o report.html。这样得到的是整个区间的汇总。

要注意顺序,日志按时间先后拼,反了会导致趋势图乱掉。

如果日志保留时间很长,几百个文件一起处理会很慢。可以按周或者按月做汇总,别一次搞一整年。

把它做成每天自动看

最简单的做法是加一个定时任务,每天凌晨跑一次,生成 html 放到某个目录,你自己打开看。命令一行就够,加个日期后缀区分。

更省事的做法是把报告接入你的后台,生成完直接跳转。做个入口比记路径方便。

如果站点有多个,给每个站单独生成一份,文件名带站点标识。别混在一起,混了就没法对比。

还有一点,报告文件别放在公开可访问的目录。它包含完整的访问明细和 IP,暴露出去等于把用户信息送人。要放就放在需要登录才能看的目录后面。

几个容易踩的坑

第一个,日志格式不匹配导致数据全错。表现是访问量统计明显偏小或者偏大,先验证格式串。

第二个,UTF-8 编码的地址解析异常。中文路径或者带参数的地址如果编码不对,面板里会显示成乱码。加 --no-term-resolver 之类的参数能缓解一部分。

第三个,反向代理之后的真实 IP 全是 127.0.0.1。因为请求是 nginx 转给你的,日志里记的是本机地址。要在 nginx 里配 real_ip 模块,从 X-Forwarded-For 里取真实 IP,日志才会准。

第四个,把日志文件当数据库用。日志是明细不是统计,真要长期分析,定期把汇总结果入库,别每次都去扫几十兆文本。

看懂日志里最关键的那几列

nginx 默认格式里几列最有用:第一个是客户端地址,能看出是谁在访问;第二个是时间,精确到秒;第三个是请求行,包含方法和路径;第四个是状态码;最后是 UA 和 referer。

状态码这一列要背下来几个:200 正常,301 和 302 是跳转,304 是有缓存没重新下,403 是被拒绝,404 是找不到,499 是客户端主动断开,502 是后端挂了。

请求行里的路径最能说明问题。同一路径被反复请求,要么是很受欢迎,要么是被刷。路径里带奇怪参数的,多半是扫描器在探测漏洞。

把这几列看熟,不用工具也能从一堆日志里快速看出异常。工具只是把这些手工扫的动作自动化了。