熱門分類
載入中…
目錄0%

📊 GoAccess 網站流量監控教學:Nginx/Apache 日誌即時圖形化、Dashboard 安裝與設定

    📊 GoAccess 網站流量監控教學:Nginx/Apache 日誌即時圖形化、Dashboard 安裝與設定

    架站之後,要知道「誰在看、看了什麼、哪裡出問題」,就一定會碰到 log 分析。 傳統用 grepawk 慢慢撈不只耗時間,也很難給主管或同事一個直覺的圖形報表。 本文示範如何在 Linux 上使用 GoAccess,從 CLI 即時分析HTML Dashboard, 並整合 Nginx/Apache log_format、排程產生每日報表與 反向代理+HTTPS 的完整實戰流程。

    📑 目錄

    一、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 到可分享的報表

    1. 確認 Nginx/Apache 的 log_format 已固定,先不要隨意改欄位。
    2. /etc/goaccess/goaccess.conf 中定義 time-formatdate-formatlog-format
    3. 先用 CLI 模式跑一次歷史 log,確認 沒有大量「無法解析」錯誤
    4. 啟用 --real-time-html,驗證 HTML Dashboard 是否正常更新。
    5. 透過 Nginx / Apache 做反向代理與 HTTPS,加上簡單的 IP 限制或 Basic Auth。
    6. 寫 cron 腳本,產出每日、每週、每月報表,放在內部入口頁中。
    7. 最後再搭配 Proxy / 防火牆 / Fail2Ban 文章,把 log 分析納入日常維運流程。

    九、常見問題與排錯清單

    • 問題一:畫面空白、所有欄位都是 0
      → 通常是 log-format 不符,請先用 --debug-file 寫出 debug log 查看。
    • 問題二:時間顯示錯誤,日期跑到未來或過去
      → 檢查日誌中的時間格式,重新設定 time-formatdate-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・系統與網路筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級