导读:本站之前写过Umami自建统计,它靠页面里埋一段JS采集数据,很优雅,但有两个先天盲区:纯API服务没有页面可埋、被拦截器挡掉的那部分访客永远进不了报表。而另一座数据金矿一直在你机器上躺着——Nginx的access log,每个请求一行,一个不漏。这篇讲GoAccess:一个开源的日志分析引擎,直接啃日志文件,生成实时HTML报表:访客趋势、热门页面、来源站点、状态码分布、爬虫占比、404清单,全是现成的。零埋点、零隐私争议、零性能开销,配合站内的日志类文章,把服务器日志从"占磁盘的负担"变成"运营仪表盘"。
一、为什么日志是更好的数据源:先看它记了什么
先看一行典型的Nginx access log(combined格式):
203.0.113.7 - - [29/Aug/2026:10:23:45 +0800] "GET /vps-tutorial HTTP/1.1" 200 5120 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0) ..."
一行日志,拆开是八个字段:访客IP、时间、请求方法和路径、HTTP版本、状态码、响应字节数、来源页(Referer)、UserAgent。这八个维度组合起来,就是一份完整的访客行为记录。
对比一下Umami这类JS统计:JS统计要等浏览器执行脚本才记到数,而日志在请求到达服务器的瞬间就记下了;JS会被拦截器挡,日志不会;JS统计不了爬虫(爬虫不执行JS),日志里爬虫的每一次抓取都白纸黑字。
日志的三大优势:全量(不漏一个请求,包括API、图片、静态文件)、真实(不依赖客户端配合)、免费(本来就一直在写)。劣势是维度有限——日志里没有屏幕分辨率、没有事件点击、没有会话时长,做不了深层行为分析。所以正确姿势是两者互补:Umami看人,GoAccess看流量。本站统计文章里讲过"被拦截的访客"概念,GoAccess正是把这些影子访客捞回来的工具。
二、五分钟上手:一条命令出报表
GoAccess是C写的,性能极强,处理几个G的日志文件也是秒级。安装:
apt install goaccess -y
最简单的用法,直接分析日志出终端报告:
goaccess /var/log/nginx/access.log --log-format=COMBINED
终端里会刷出一个交互式面板,方向键切换模块。但终端报表是给运维看的,我们要的是可以日常打开的网页。生成HTML报表:
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/report.html
把report.html放到网站目录(或者按本站反代教程配个子域名),浏览器打开,一个完整的分析面板就出来了:按天按小时的流量曲线、访客数、请求列表、404页面、操作系统、浏览器、来源域名,十几个模块。
这里有个必须马上处理的问题:报表是静态快照,今天生成明天就旧了。让报表持续更新是第三节的内容,先把单次分析跑通、看懂每个模块。
三、实时模式:让报表自己动起来
GoAccess的原生技能是实时模式,原理很酷:它tail日志文件的新增行,解析后通过WebSocket把增量推给浏览器页面,报表里的数字实时跳动。
启动实时模式:
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/report.html --real-time-html --daemonize --daemonize让它退到后台常驻。此后access.log每新增一行,网页报表一秒内自动更新,访客在线数、当前热门页面实时可见。注意防火墙要放行GoAccess的WebSocket端口(默认7890,可用--ws-port改),报表页面才能建立长连接。
进程管理建议用systemd接管(写法参考下一节思路):daemonize方式重启机器后不会自己活过来,注册成服务才稳。内存占用很小,几十M,跟本站讲过的其他常驻服务可以合租一台小鸡。
四、日志轮转的坑:报表为什么突然不更新了
跑实时模式最常见的故障:某天凌晨报表不更新了。原因是logrotate(本站磁盘清理文章提过它)在半夜把access.log切走了:老日志改名成access.log.1,新的access.log从空文件开始,而GoAccess还盯着旧文件的句柄。
GoAccess自带应对:启动时加 --keep-db-files 和 --load-from-disk 参数,会把已解析的日志进度存盘,配合logrotate的copytruncate模式(复制后清空原文件而不是改名),句柄不失效,追踪不断档。
更省心的方案是不追文件、改追管道:让Nginx把日志写进管道由GoAccess消费,或者干脆放弃常驻,改用cron(本站有专门的定时任务详解)每小时重新全量分析一次,生成新报表覆盖旧文件。个人站的数据粒度到小时已经够用,还免去了进程管理的心智负担——两种方案按你的折腾意愿二选一。
五、报表模块逐个讲:每个数字能告诉你什么
HTML报表的十几个面板,挑站长最该盯的六个说。
Unique Visitors(独立访客):按IP聚合的UV曲线。注意这是"IP口径"的UV,比Umami的"指纹口径"略粗(同一IP下的两个人算一个),但趋势完全够参考。
Requested Files(热门路径):按请求量排序的URL列表。这里要看的不只是排名,还有异常:某个你从没宣传过的老文章突然上榜,多半是被搜索引擎翻牌了,顺着来源模块查证。
404 or Not Found(死链清单):高频404是宝藏清单——被外链引用却写错路径的页面、删除后仍被收录的文章。修复方式二选一:恢复内容,或按本站反代教程给旧路径配301跳转到新页面,把流量接住。
Referring Sites(来源站点):外链排行。友情链接带来的流量、论坛帖子被点了几次,这里一目了然。做友链交换决策时,这个面板就是你的谈判筹码。
Status Codes(状态码分布):200占比健康度、301/302跳转量、403被拒的扫描量、502后端故障次数。某天502占比突然冒头,回去翻本站反代排障文章,多半是后端服务抖了。
Crawlers(爬虫):搜索引擎机器人的抓取量。新站想被收录,先看这里有没有Googlebot和Baiduspider的痕迹;抓取量持续上涨,通常是收录权重提升的先行指标。
六、进阶:自定义日志格式的匹配
如果你的Nginx日志格式被改过(比如按本站性能文章的建议加了请求耗时字段),COMBINED预置格式就对不上了,GoAccess会报"没有匹配到时间格式"之类的错。这时要手工指定格式。
假设日志格式是:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
对应的GoAccess参数:
goaccess access.log --log-format='%h - %u [%d:%t %z] "%r" %s %b "%R" "%u" %T' --date-format='%d/%b/%Y' --time-format='%H:%M:%S' --datetime-format=%d/%b/%Y:%H:%M:%S
格式符对照:'%h'客户端IP、'%d'日期、'%t'时间、'%r'请求行、'%s'状态码、'%b'字节数、'%R'Referer、'%u'UserAgent、'%T'耗时秒。配一次就永远通,改日志格式时记得同步改这里。
GeoIP地理位置也值得开:装libgeoip-dev后重新编译GoAccess,报表里会多出"访客国家分布"面板。想判断CDN节点选哪、海外流量占比多少,这个面板直接给答案——呼应本站CDN选型文章里的判断依据。
七、安全提醒:报表别裸奔
报表页面包含全量访问路径和IP,不该公开。三种保护方式按强度选。
最简:报表不放网站目录,放个随机路径名的子目录,路径即密码,仅自己收藏。
标准:按本站反代教程给报表单独配子域名,加HTTP Basic Auth:
location / {
auth_basic "Admin Only";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:7890;
}
最强:报表端口只绑127.0.0.1,出门全走SSH隧道:ssh -L 7890:127.0.0.1:7890 vps,本地浏览器开localhost:7890查看,公网零暴露。
八、日志的另外半座金矿:error log
顺手提一句access的兄弟error log。GoAccess不管它,但error log同样值得定期看:
grep -c "limit_req" /var/log/nginx/error.log
一条命令统计被限速拒绝的请求数——本站安全文章讲过的限速策略有没有在起作用,这里见分晓。upstream超时、SSL握手失败的记录也都在这,是排障时的第一手证词。
结语
数据不在远方,就在/var/log/nginx里每天安静增长的那行日志里。GoAccess几十M内存的成本,把全量请求变成可视化仪表盘:热门内容、死链修复、外链效果、爬虫动向,全都是现成的运营情报。配合Umami(JS端视角)形成双镜头:一个看人怎么看你的站,一个看流量怎么打你的站。至此你机器上的每一块数据——密码、订阅、书签、统计、日志——都已经明明白白。运营个人网站最迷人的部分,就是这些数字开始会说话的时刻。




