使用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
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相關文章:

翻譯: