goaccess 配置记录

Posted on Sat 09 September 2017 in 遗迹

本来是计划弄一个站点统计的,初步意向是百度,结果发现被 adblock 默认规则屏蔽了。

拿关键字一搜发现不仅是百度,不少人专门将各种统计都配置成全家被屏蔽的状态,这可就不得了了。于是看看自建的web统计方案,基本上就是 piwik 一家独大。然而群众又表示这货很占资源,我这小服务器就还是算了吧。

后面又试图转战 VeryNginx,好嘛,这项目我也盯了很久了。谁知此项目毫无长进,访问统计废到不能再废,也是无法解决问题。

因此最后方案是 goaccess ,实际上这不是统计而是 nginx 日志分析。对单页应用来说肯定各种不准,但也无所谓了。我就随便看看大致情况,图个乐就行。

https://goaccess.io

ubuntu系统的默认源里有这个软件,但是版本是 0.9.x,我看到最新稳定版本是 1.2,那就按官方文档添加源吧。

echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install goaccess

装好以后是个命令行工具,但我想要开web服务好像不是那么简单。官方配置文档看得人头大,看着也没什么 step by step 的内容,所以写个文章记下来。

下面正式开始:

1. 统一日志格式

我有一些非标准形式的nginx日志,这是从上古流传下来的一份个人配置导致的,我决定把他们全清了。反正我也从来不看。

具体过程就是改配置,删去格式定义和使用该格式的地方。停掉 nginx 删除所有旧日志等等。

2. 简单配置 goaccess.conf

先试一下官方的例子。

cd /var/log/nginx
goaccess access.log -o report.html --real-time-html

提示需要对 /etc/goaccess.conf 进行配置

GoAccess - version 1.2 - Mar  7 2017 06:40:58
Config file: /etc/goaccess.conf

Fatal error has occurred
Error occured at: src/parser.c - parse_log - 2705
No time format was found on your conf file.

打开这个文件以后,我们看到几个标着 (required) 的项目

其中 Time Format Options (required)Date Format Options (required) 我们都选第一项,因为提示是 Apache/NGINX's log formats below

Log Format Options (required) 则让人有点懵逼,因为分成了NCSA Combined Log FormatCommon Log Format (CLF)W3C 等等好多种

进行比对之后确认 nginx 是 NCSA Combined Log Format,因此把 #log-format COMBINED 这行的注释取消掉。

所以目前实际有用的就三行:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format COMBINED

其他保持默认即可。

3. 实时 web 分析页面

再来看这条命令:

goaccess access.log -o report.html --real-time-html

根据文档 https://goaccess.io/man SERVER OPTIONS 一节的描述,goaccess还可以加 --addr --port 等参数。

这导致我陷入了一个严重的误区:我误以为 goaccess 能够直接提供一个对外的完整 web 服务,然后怎么调都调不对。

实际上,goaccess 只能生成一个 html 报告文件,需要你使用 http server 将此文件挂到网络上,也就是 -o report.html 里面的这个 report.html。

而 --real-time-html 的作用是启动一个 websocket 服务,默认会启动在 0.0.0.0 并挂在 7890 端口上。

在这之后,访问 report.html,他会试图去连接这个ws服务,从而完成数据的更新

那么现在理清了思路,开始写配置文件:

sudo vi /etc/nginx/conf.d/tongji.conf

别忘了顺便把 websocket 也映射了。

server {
    listen 80;
    server_name tongji.fy0.me;

    location /ws/ {
        proxy_pass http://localhost:7890;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    root /var/web/tongji;
    index index.html;
}

然后执行以下命令:

sudo goaccess ./access.log -o /var/web/tongji/index.html --real-time-html --ws-url=ws://tongji.fy0.me:80/ws/ --addr=127.0.0.1

这样就可以访问了

细节处还有很多问题,接下来一一修正。

4. 完善细节

时区问题

如果你右上角显示的时间不对,那么注意你的系统时区。

timedatectl # 查看
sudo timedatectl set-timezone Asia/Shanghai # 设置时区为东八区

多个日志文件

sudo goaccess ./*access.log* -o /var/web/tongji/index.html --real-time-html --ws-url=ws://tongji.fy0.me:80/ws/ --addr=127.0.0.1

如果单目录下多文件直接使用路径通配,多目录的话在 ./*access.log* 后面再加一条路径就行。

不过这东西毕竟不是站点统计,也没有针对域名的过滤器。所以建议不同服务配置不同的 access_log 然后分别开一个服务。

REFERRERS URLS 面板

内容比较有趣,通过编辑 /etc/goaccess.conf,将

ignore-panel REFERRERS

这一行注释掉来开启。

多个服务配置

在上面使用的命令后面加上 --port=xxxx --daemonize 这么一段参数,端口号一字排开。-o-ws-url 也进行修改分别对应生成不同的 html 文件还有访问不同的 ws 地址。

总之就是端口号、ws-url、文件名三项要改,再加上对应的nginx配置。如果 ws 连接状态码得到301,那不用想就是请求转发失败,特别注意 /ws/ws/ 的区别。

4. 感想 & 结束

什么破玩意,以后不搞了。