使用goaccess实时分析Caddy日志

前几天我用 nginxpulse 做日志分析的时候,发现了一些问题,比如手机或者平板访问 UI 会错乱,"访问明细"页几乎没法看,于是想着部署个 goaccess 试试看。

要在 Caddy 下实现多域名实时访问,网上还没什么比较好的示例,下面记录我的踩坑过程。

1. 安装 GoAccess

强烈建议源码安装,因为各 Linux 发行版仓库带的版本低于 GoAccess 的当前版本,会导致部分功能受限。

比如我遇到的情况是:Debian 上的版本过低,导致 Geo Location 面板上就没有 World MapAzimuthal/Globe 选项,效果和官方 demo 比,可以说是天差地别,前者会显示一幅标准 2D 世界地图, 后者会显示一个 3D 世界地图。

此外,源码安装,也最好直接从官网下载源码包:

1$ wget https://tar.goaccess.io/goaccess-1.9.4.tar.gz
2$ tar -xzvf goaccess-1.9.4.tar.gz
3$ cd goaccess-1.9.4/
4$ ./configure --enable-utf8 --enable-geoip=mmdb --with-openssl
5$ make
6# make install

从 github 下载包,会遇到没有 configure 程序的问题,别问我怎么知道,踩过坑。

如果编译报错,大概率是缺了 Ncursesw 相关依赖,按提示搜索,安装发行版对应的包就好。官方 https://goaccess.io/download 页有介绍。

2. 配置解析 Caddy 日志文件

所谓日志分析,就是解析日志,然后重新聚合展示。

直接看我的配置(过滤了注释行、空行和 static-file|no 开头的行,方便查看关键信息):

 1root@tokyo:~# egrep -v "^#|^$|^static|^no" /etc/goaccess/goaccess.conf
 2date-format %s
 3log-format {ts:"%x.%^",request:{remote_ip:"%h",proto:"%H",method:"%m",host:"%v",uri:"%U",headers:{"User-Agent":["%u","%^"]},tls:{cipher_suite:"%k",proto:"%K"}},duration:"%T",size:"%b",status:"%s",resp_headers:{"Content-Type":["%M;%^"]}}
 4log-format CADDY
 5config-dialog false
 6hl-header true
 7json-pretty-print false
 8tz Asia/Shanghai
 9with-mouse false
10addr 127.0.0.1
11daemonize true
12real-time-html true
13ws-url wss://goaccess.xxx.com:443/ws
14log-file /var/log/caddy/xxx.com.cc.log
15agent-list false
16with-output-resolver false
17http-method yes
18http-protocol yes
19output /data/goaccess/xxx.com.html
20444-as-404 false
214xx-to-unique-count false
22all-static-files false
23double-decode false
24ignore-crawlers false
25crawlers-only false
26unknowns-as-crawlers false
27real-os true
28geoip-database /usr/share/GeoIP/GeoLite2-City.mmdb
29geoip-database /usr/share/GeoIP/GeoLite2-ASN.mmdb

关键点配置:

  • date-format %s Caddy 需要
  • log-format 开头的两个配置,一个做 CADDY JSON Structured 解析的;log-format CADDY 告诉 GoAccess 当前的日志类型为 Caddy
  • tz Asia/Shanghai 时区设置,看个人喜好了
  • addr 127.0.0.1 关键,安全相关配置,建议本地监听,通过代理转发出去
  • real-time-html true 开启网页实时刷新,GoAccess 会通过 websocket 刷新数据
  • ws-url wss://goaccess.xxx.com:443/ws 真实 websocket 响应接口,很关键。这个地方配置错误的话,可通过浏览器调试窗口排查
  • log-file /var/log/caddy/xxx.com.cc.log 需要分析的目标日志文件
  • output /data/goaccess/xxx.com.html 生成的 html 文件,浏览器最终查看访问的是这个
  • geoip-database /usr/share/GeoIP/GeoLite2-City.mmdb IP 地址精确到城市,需要额外 IP 地址库
  • geoip-database /usr/share/GeoIP/GeoLite2-ASN.mmdb 好像是网络运营商信息,比如 AT&T Services, Inc.Chinanet

监听端口也可按需修改,默认是:port 7890

GeoLite2 相关数据库文件去这里下载:https://github.com/P3TERX/GeoLite.mmdb

systemd 文件配置:

 1root@tokyo:~# systemctl cat goaccess.service
 2# /etc/systemd/system/goaccess.service
 3[Unit]
 4Description=GoAccess Real-Time Log Analyzer
 5After=network.target caddy.service
 6
 7[Service]
 8User=root
 9ExecStart=/usr/local/bin/goaccess -p /etc/goaccess/goaccess.conf
10Type=forking
11Restart=on-failure
12RestartSec=5
13StartLimitBurst=5
14StartLimitInterval=30s
15
16[Install]
17WantedBy=multi-user.target

注意其中的 Type=forking,不然没法正常启动。或者你不配置 daemonize true,那这一行也可以去掉,主进程会在启动时 fork 出一个子进程,然后父进程退出,而子进程继续在后台运行时才需要 Type=forking

3. 配置 Caddy 访问输出页

请看配置

 1logs.xxx.com {
 2	encode zstd br gzip
 3	root * /data/goaccess
 4	file_server
 5	basic_auth {
 6		your_username your_hash_password  # caddy hash-password
 7	}
 8	reverse_proxy /ws localhost:7890
 9	reverse_proxy /ws_another localhost:7891 # 多个域名日志分析,如果想分实例解析
10}

这样浏览器就能通过 https://logs.xxx.com/xxx.com.html 访问实时刷新的日志。

如果遇到实时刷新错误,F12 打开浏览器调窗口,搜索 ws,看是否报错,response 中数据是否正常刷新,按报错提示处理。

截图示例操作如下:

goaccess-websocket-check

4. 多域名日志配置

如果你有多个域名,分别写日志到不同路径,比如 foo.xxx.com.log、bar.xxx.com.log,还想多页面独立查看。

可以考虑分 2 个 goaccess 实例处理的。监听端口分开下,Caddy 代理像上面所示的那样,分别代理到不同端口。

还可以让 AI 帮你写个 index.html, 实现路由到不同页面的逻辑,再把 index.html 放到 root * /data/goaccess 指示的 root 目录中,我就是这么做的,很方便的。

5. 最终效果图

截图示例:

goaccess-shotcut-demo

可以看出 ASN 和 Geo Location 都正确显示了,老实说,首次配置的话,还是要花点时间摸索的。

用手机或者电脑访问下被解析日志站点,数据就能实时刷新。

不想部署,只想看看效果的,也可以直接去 goaccess 官网看其提供的 live demo 页。

不管是 nginxpulse 还是 goaccess 目前都不能直接查看原始日志,毕竟轻量工具,不能和企业级的大型日志系统 OpenObserve、ELK 等相比,适用场景不一样,成本也千差万别。

最后修改于: Saturday, January 24, 2026
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相关文章:

翻译: