📊 GoAccess 網站流量監控教學:Nginx/Apache 日誌即時圖形化、Dashboard 安裝與設定
架站之後,要知道「誰在看、看了什麼、哪裡出問題」,就一定會碰到 log 分析。
傳統用 grep、awk 慢慢撈不只耗時間,也很難給主管或同事一個直覺的圖形報表。
本文示範如何在 Linux 上使用 GoAccess,從 CLI 即時分析 到 HTML Dashboard,
並整合 Nginx/Apache log_format、排程產生每日報表與 反向代理+HTTPS 的完整實戰流程。
📑 目錄
- 一、GoAccess 是什麼?適合哪些情境?
- 二、GoAccess 安裝與基本使用(CLI 模式)
- 三、Nginx / Apache log_format 設定與常見格式
- 四、CLI 即時分析:像 top 一樣看網站流量
- 五、HTML Dashboard:--real-time-html 即時圖形介面
- 六、排程每日報表:cron 自動產生 HTML 分析頁
- 七、反向代理 + HTTPS:Nginx Proxy 與 WebSocket 設定
- 八、實戰建議流程:從原始 log 到可分享的報表
- 九、常見問題與排錯清單
- 🔟 行動清單(Checklist)
- 🔗 延伸閱讀
一、GoAccess 是什麼?適合哪些情境?
GoAccess 是一套用 C 寫成的 輕量級 Web 日誌分析工具,可支援:
- 終端機即時介面(CLI):類似
htop的互動畫面。 - HTML Dashboard:互動式圖表、排序、篩選。
- 支援 Nginx / Apache / CloudFront 等常見格式。
- 可顯示:熱門頁面、HTTP 狀態碼、User-Agent、來源國家、Referer、Response Time 等。
適用情境:
- 你已經有 Nginx/Apache log,但還沒接 GA4 或只想看 server 端真實流量。
- 想做 內部報表,但不想把所有資料丟給第三方。
- 用 Squid Proxy / 反向代理,希望快速觀察流量與異常狀態。
二、GoAccess 安裝與基本使用(CLI 模式)
以下以常見 Linux 發行版為例:
1. Debian / Ubuntu 系列
# 更新套件索引
sudo apt update
# 安裝 GoAccess
sudo apt install goaccess -y
2. RHEL / CentOS / Rocky / AlmaLinux
部分版本需要啟用 EPEL 或官方 repo:
# 安裝 EPEL(依實際版本調整)
sudo yum install epel-release -y
# 安裝 GoAccess
sudo yum install goaccess -y
# 或 dnf
# sudo dnf install goaccess -y
3. 確認版本
goaccess --version
最基本的使用方式是直接指定 log 檔與格式:
# 以 Nginx 預設格式為例
goaccess /var/log/nginx/access.log \
--log-format=COMBINED \
--time-format=%T \
--date-format=%d/%b/%Y
進入後即可在終端機看到互動畫面,透過方向鍵、Tab 切換不同分析面板,
例如「Requests」「Visitors」「HTTP Status」「OS」「Browsers」等。
三、Nginx / Apache log_format 設定與常見格式
GoAccess 解析的關鍵在於日誌格式必須精準對應。官方已內建部分預設(例如
COMBINED),但如果你有自訂 log_format,就要手動指定。
1. Nginx:常見 log_format 設定
在 /etc/nginx/nginx.conf 或 site config 中,常見的設定如下:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time';
access_log /var/log/nginx/access.log main;
對應 GoAccess 可以這樣定義:
time-format %T
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T
建議建立一個 /etc/goaccess/goaccess.conf 設定檔,將上述內容寫入,
之後執行時就不用每次打一長串參數。
2. Apache:常見 log_format 設定
Apache 預設的 combined log_format 通常如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "/var/log/httpd/access_log" combined
對應 GoAccess 設定:
time-format %T
date-format %d/%b/%Y
log-format %h %^ %e [%d:%t %^] "%r" %s %b "%R" "%u"
如果你的 log_format 有額外欄位(例如 %v、%{X-Forwarded-For}i、%D),
建議在正式上線前,先用 goaccess --dcf 測試解析是否正常。
四、CLI 即時分析:像 top 一樣看網站流量
CLI 模式最大的優點是:你可以直接 SSH 進 server,像看 top 一樣看流量變化。 適合現場排錯、壓力測試、異常流量監控。
1. 讀取歷史 log(批次模式)
sudo goaccess /var/log/nginx/access.log \
-p /etc/goaccess/goaccess.conf
2. 即時模式:搭配 tail -F
# 方式一:直接在 GoAccess 內跟隨檔案
sudo goaccess /var/log/nginx/access.log \
-p /etc/goaccess/goaccess.conf \
--real-time-html -o /tmp/ignore.html
# (雖然產出 HTML,但你也可以只用 CLI 當下看)
# 方式二:透過管線
sudo tail -F /var/log/nginx/access.log | \
goaccess -p /etc/goaccess/goaccess.conf
常用快捷操作:
- Tab:切換不同分析面板。
- s:切換排序欄位。
- o:切換排序方向(遞增/遞減)。
- g / G:跳到列表頂端/底端。
- q:離開程式並輸出結果(批次模式)。
五、HTML Dashboard:--real-time-html 即時圖形介面
對於需要展示給主管、同事或客戶看的人來說, HTML Dashboard 是 GoAccess 最有價值的功能之一。
1. 建立資料目錄與報表路徑
sudo mkdir -p /var/www/goaccess
sudo chown -R www-data:www-data /var/www/goaccess # 依你的 Web 使用者調整
2. 啟動 GoAccess 即時 HTML 模式
以下以 Nginx 為例:
sudo goaccess /var/log/nginx/access.log \
-p /etc/goaccess/goaccess.conf \
--real-time-html \
--ws-url=ws://127.0.0.1:7890 \
--port=7890 \
-o /var/www/goaccess/index.html
參數說明:
--real-time-html:啟用即時更新的 HTML Dashboard。--ws-url:WebSocket URL,之後會由 Nginx Proxy 轉發。--port:GoAccess 內建 WebSocket server 監聽 port。-o:輸出 Dashboard HTML 路徑。
執行後,/var/www/goaccess/index.html 就會是一個可以透過瀏覽器查看的
即時流量 Dashboard,只要 WebSocket 正常連線,就會不停更新。
六、排程每日報表:cron 自動產生 HTML 分析頁
除了即時 Dashboard,很多情況你只需要 每日/每週 的靜態報表, 比方說每天早上看前一天的熱門頁面、錯誤碼或外部導流來源。
1. 撰寫產生報表腳本
建立一個簡單的 shell script,例如 /usr/local/sbin/gen-goaccess-report.sh:
#!/usr/bin/env bash
LOG=/var/log/nginx/access.log
REPORT=/var/www/goaccess/daily-$(date +%F).html
CONF=/etc/goaccess/goaccess.conf
goaccess "$LOG" \
-p "$CONF" \
-o "$REPORT" \
--html-report-title="Daily Report - $(date +%F)"
記得給執行權限:
sudo chmod +x /usr/local/sbin/gen-goaccess-report.sh
2. 使用 cron 排程每日生成
以 root 身分編輯 crontab:
sudo crontab -e
加入排程(例如每天 02:10 產生前一天報表):
10 2 * * * /usr/local/sbin/gen-goaccess-report.sh >/var/log/goaccess_cron.log 2>&1
之後你可以在某個「報表索引頁」或內部 Wiki 中,放上
/var/www/goaccess/daily-YYYY-MM-DD.html 的連結,
讓團隊可以回頭查歷史流量。
七、反向代理 + HTTPS:Nginx Proxy 與 WebSocket 設定
多數情況你不會直接在 7890 port 開放給外網,而是由 Nginx 反向代理, 一併處理 HTTPS 與 WebSocket 轉發。
1. Nginx 站台設定範例
建立或編輯一個 server block,例如:
server {
listen 443 ssl;
server_name goaccess.example.com;
ssl_certificate /etc/letsencrypt/live/goaccess.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/goaccess.example.com/privkey.pem;
root /var/www/goaccess;
# 提供 HTML Dashboard
location / {
try_files $uri /index.html;
}
# WebSocket Proxy
location /ws/ {
proxy_pass http://127.0.0.1:7890/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
對應 GoAccess 的啟動方式:
sudo goaccess /var/log/nginx/access.log \
-p /etc/goaccess/goaccess.conf \
--real-time-html \
--ws-url=wss://goaccess.example.com/ws/ \
--port=7890 \
-o /var/www/goaccess/index.html
注意:
--ws-url改成 wss + 反向代理路徑。- Nginx 的
location /ws/設定必須與之對應。 - 外部使用者只會看到
https://goaccess.example.com/,內部由 Nginx 處理加密與轉發。
八、實戰建議流程:從原始 log 到可分享的報表
- 確認 Nginx/Apache 的 log_format 已固定,先不要隨意改欄位。
- 在
/etc/goaccess/goaccess.conf中定義time-format、date-format、log-format。 - 先用 CLI 模式跑一次歷史 log,確認 沒有大量「無法解析」錯誤。
- 啟用 --real-time-html,驗證 HTML Dashboard 是否正常更新。
- 透過 Nginx / Apache 做反向代理與 HTTPS,加上簡單的 IP 限制或 Basic Auth。
- 寫 cron 腳本,產出每日、每週、每月報表,放在內部入口頁中。
- 最後再搭配 Proxy / 防火牆 / Fail2Ban 文章,把 log 分析納入日常維運流程。
九、常見問題與排錯清單
-
問題一:畫面空白、所有欄位都是 0
→ 通常是log-format不符,請先用--debug-file寫出 debug log 查看。 -
問題二:時間顯示錯誤,日期跑到未來或過去
→ 檢查日誌中的時間格式,重新設定time-format與date-format。 -
問題三:HTML Dashboard 開啟,但數據不更新
→ 檢查瀏覽器開發者工具的 WebSocket 連線是否成功;確認 Nginx Proxy 的 Upgrade/Connection 標頭設定。 -
問題四:CPU 使用率偏高
→ 確認是否有一次處理過多歷史 log,可先使用 logrotate 切割,再針對近期 log 做即時分析。 -
問題五:多台 Web 節點的 log 想合併分析
→ 可以透過rsync或集中 log 到一台分析機,再將多個檔案串起來供 GoAccess 使用。
🧭 行動清單(Checklist)
✅ 在 /etc/goaccess/goaccess.conf 中定義正確的 log-format
✅ 使用 CLI 模式先驗證一小段 access.log 是否能正確解析
✅ 啟用 --real-time-html 並檢查 HTML Dashboard 更新狀況
✅ 透過 Nginx/Apache 反向代理,將 Dashboard 放到 HTTPS 網域下
✅ 設定 cron 排程,產生每日/每週靜態報表供團隊查閱
✅ 將 GoAccess 納入日常維運流程:異常流量、404/5xx、熱門頁面盤點
💬 互動留言
💡 留下你的實戰經驗,讓這篇 GoAccess 教學對更多人更有幫助。
- 你目前是如何觀察網站或 Proxy 的流量表現?
- 有沒有遇過「看 log 看到眼花」但最後靠某個工具救回來的案例?
- 未來想看哪一類「log 分析 / 監控」相關教學?
💡 「留下你的觀點,讓討論更精彩!」歡迎在下方留言區分享你的做法或問題。
🔗 延伸閱讀
-
🧱 Linux Proxy Server 建置教學(Squid 安裝與設定指南) – 搭配 GoAccess 分析 Proxy 流量更完整。
🔗 查看 Squid 相關文章 -
🐧 Linux 防火牆完整解析:iptables 與 nftables 架構、規則、差異與最佳實務
🔗 Linux 防火牆教學 -
🐧 一行搞定!Linux 管線符號與文字處理工具完整教學(grep / awk / sed / sort / uniq / wc ...)
🔗 Linux 文字處理教學 -
🐧 Linux systemd 深入解析與啟動流程管理 – 了解服務啟動鏈與資源控制,搭配 log 分析更好查問題。
🔗 systemd 深入解析 -
🐧 Linux SSH 安全強化指南:金鑰登入、Port 轉移與 Fail2Ban 整合
🔗 SSH 安全強化教學
📘 結語
GoAccess 不是要取代 GA4 或各種雲端分析服務,而是提供一種 站在伺服器角度、接近真實流量的視角。 對於系統與網路管理者來說,它能在你還來不及登入各種平台之前, 就先讓你看到:「現在到底發生了什麼事」。
建議你先從 CLI 模式開始熟悉,確認 log 格式與資料品質無誤,再慢慢導入 HTML Dashboard、排程報表與反向代理。當這一套流程穩定下來, 不只是日常維運會輕鬆許多,你在面對突發事件、專案簡報與跨部門溝通時,也會多一份底氣。
— WWFandy・系統與網路筆記
沒有留言: