SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-16

自架網站分析工具推薦:VPS 資源需求與比較

評估 Plausible、Umami、Matomo、GoatCounter 與 GoAccess 的 VPS 部署方案。分析記憶體用量、資料庫配置、磁碟增長與反向代理設定,並探討阻擋廣告與爬蟲對數據準確度的影響。

您應該在 VPS 上執行哪種自架網站分析工具?

自架網站分析工具分為兩大類,選擇錯誤的類別比選錯產品代價更高。第一類是在訪客瀏覽器中執行小型指令碼,並儲存該指令碼回報的數據。第二類則是讀取網頁伺服器已產生的存取日誌(access log)。後續的所有需求,包括資料庫與記憶體用量,皆取決於這項選擇。

對於小型伺服器,簡短的建議如下:GoatCounter 與 Medama 適用於 1 GB 記憶體的環境,因為兩者皆為單一處理程序搭配單一檔案。Umami 會增加一個 Postgres 容器,並提供非技術人員也能閱讀的儀表板。Plausible Community Edition 與 Rybbit 皆執行 ClickHouse,因此請規劃 2 GB 或以上的 RAM。Matomo 是功能完整的產品,其伺服器規格需求取決於您的流量大小。GoAccess 完全不會對網頁造成任何負擔,因為它僅讀取現有的日誌檔案。

Script tag 與伺服器日誌:兩者能觀察到的範圍

Script tag 用於測量瀏覽器行為。當頁面載入並執行指令碼時,會發送一個請求至您的收集器。任何中斷此鏈結的因素都會導致數據遺失:例如關閉 JavaScript、請求被過濾器阻擋、收集器請求失敗,或是根本不執行指令碼的爬蟲程式。

日誌解析器則用於測量請求。無論您是否安裝任何工具,網頁伺服器都會為每個請求寫入一行紀錄,因此數據已存在於磁碟中。它能看見所有爬蟲程式,以及任何未嵌入 script tag 的檔案存取。但它無法得知瀏覽器內部的運作情形,也無法偵測從瀏覽器快取或伺服器前端 CDN (content delivery network) 提供的頁面,因為這些請求從未到達您的伺服器。

這兩組數據不會完全吻合,且兩者皆無錯誤。Matomo 可同時支援這兩種方式,並記錄了相較於 JavaScript 追蹤器,日誌匯入所遺失的資訊:螢幕解析度、頁面標題、事件、內容追蹤、熱點圖、工作階段錄影及表單分析。這份清單就是選擇計算請求而非瀏覽器的代價。

機器人流量是數據落差的另一半原因。除非您主動過濾,否則基於日誌的統計會包含爬蟲程式;在一般網站上,爬蟲的佔比足以影響您的分析結論。GoAccess 與 Matomo 的日誌匯入功能皆能過濾已知的機器人。然而,若爬蟲偽造 User Agent,兩者皆無法將其過濾。這正是為何應將基於日誌的統計與 在伺服器端阻擋 AI 爬蟲 結合,並在執行阻擋後再讀取日誌的原因。

GoAccess:從現有日誌進行分析

請從專案官方的 Debian 與 Ubuntu 套件庫進行安裝,因為發行版內建的套件版本通常較舊。

wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccess

接著將其指向日誌檔案並產生靜態報告。

goaccess /var/log/nginx/access.log -o ~/report.html --log-format=COMBINED

若以一般使用者身分執行,該指令會因 Permission denied 而失敗,因為在 Ubuntu 上,nginx 日誌的擁有者為 root,群組為 adm。請使用 sudo usermod -aG adm $USER 將自己加入該群組,然後登出並重新登入,因為群組成員資格是在登入時讀取的。執行 id 並確認 adm 出現在列表中,再嘗試執行指令。

針對即時日誌產生的報告僅涵蓋 logrotate 尚未處理的部分。昨天的請求位於 access.log.1,更早期的檔案則已壓縮,因此若要產生週報,必須同時讀取這些輪替後的檔案。

zcat /var/log/nginx/access.log.*.gz | goaccess - --log-format=COMBINED -o ~/last-week.html

此外還有即時模式 --real-time-html,可透過 WebSocket 更新頁面。這需要額外的連接埠與專屬的代理規則。對於大多數網站而言,由 cron 每小時產生的報告已足夠,且安全性維護成本較低。

GoatCounter:單一 Go 二進位檔與 SQLite 檔案

GoatCounter 以靜態編譯的二進位檔形式發布,因此無需安裝執行環境。請從發布頁面下載建置版本並執行,或直接使用映像檔。

docker run -p 8080:8080 -v goatcounter-data:/home/goatcounter/goatcounter-data arp242/goatcounter

以二進位檔執行時,goatcounter serve 會監聽 8080 埠並在 ./goatcounter-data/db.sqlite3 建立 SQLite 資料庫。若執行個體已部署於反向代理後方,建議透過命令列建立第一個站台,而非使用網頁精靈。

goatcounter db create site -vhost=stats.example.com -user.email=me@example.com

它可透過 goatcounter serve -listen=:443 -tls=tls,rdr,acme 使用 ACME (自動憑證管理環境) 自行處理憑證,這在未執行其他服務的伺服器上相當實用。若 Nginx 或 Caddy 已佔用 443 埠,請讓 GoatCounter 維持在 8080 埠並透過代理轉送。根據專案數據,追蹤指令碼大小約為 3.5K,並提供供無 JavaScript 頁面使用的追蹤像素。若在高負載站台中 SQLite 成為效能瓶頸,同一個二進位檔可透過 goatcounter serve -db 'postgresql+dbname=goatcounter' 改用 Postgres。備份僅需複製檔案,這正是此類工具架構的最大優勢。

Medama:宣稱僅需 256 MB 的單一容器

Medama 是此處最新的單一二進位檔案選項。其設計預設不使用 cookie,專案宣稱追蹤器小於 1 KB,且小型網站可在具備 256 MB 記憶體的虛擬機器上執行。以上為該專案公開的宣稱數據,並非本指南實際測量的數值。

docker volume create medama-data
docker run -d -p 127.0.0.1:8080:8080 -v medama-data:/app/data ghcr.io/medama-io/medama:latest

官方指令將連接埠發佈為 8080:8080。上述的 loopback 前綴是刻意設定的,反向代理章節會說明原因。首次登入帳號為 admin,密碼為 CHANGE_ME_ON_FIRST_LOGIN,該密碼名稱即為操作指示。

有一種已記錄的失敗模式會影響使用者。登入僅能在 HTTPS 或 localhost 下運作,因此若您在設定憑證前先設定代理,表單會拒絕正確的密碼,且不會顯示原因。請先完成 TLS (傳輸層安全性) 設定,再進行登入。

Umami:Postgres 與廣為人知的儀表板

git clone https://github.com/umami-software/umami.git
cd umami
docker compose up -d

此指令會在 3000 埠啟動應用程式,並同時執行一個 PostgreSQL 容器。官方文件指出 PostgreSQL v12.14 為最低需求,若選擇從原始碼編譯,則需 Node.js 18.18 或更新版本。官方提供預先建置好的映像檔 docker.umami.is/umami-software/umami:postgresql-latest,該映像檔需要 DATABASE_URL 指向您現有的資料庫。

首次登入帳號為 admin,密碼為 umami。在將 DNS 指向該伺服器前,請務必先修改密碼;因為一旦 DNS 記錄解析完成且反向代理開始回應,該執行個體便可從網際網路直接存取。關於 Docker Compose 的詳細設定、環境變數檔案與重啟策略,請參考 VPS 上的 Docker Compose 堆疊,切勿直接複製未經閱讀的堆疊設定。

此服務的資源佔用為一個 Node 程序加上 Postgres。這比單一二進位檔更耗資源,但遠比任何執行 ClickHouse 的服務輕量。

Plausible Community Edition:ClickHouse 的記憶體下限

git clone -b v3.2.1 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
touch .env
echo "BASE_URL=https://stats.example.com" >> .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48)" >> .env
docker compose up -d

v3.2.1 為 2026 年 8 月時的最新版本,複製指令已明確鎖定此版本。此堆疊包含三個部分:應用程式、用於儲存帳號與設定的 Postgres,以及用於事件資料的 ClickHouse。SECRET_KEY_BASE 必須至少為 64 位元組的字串,這正是 openssl 呼叫所產生的長度。

Plausible 本身要求至少 2 GB 的 RAM,以避免 ClickHouse 與應用程式觸發 OOM (Out of Memory) killer;此外,CPU 必須支援 ClickHouse 所需的 SSE 4.2 或 NEON 指令集。在購買前務必確認第二項要求,這也是 選擇 ARM 或 x86 VPS 時的實際差異之一。ClickHouse 會盡可能佔用可用記憶體,因此若在共享主機上執行,請依照 在 Compose 中限制容器記憶體 的說明設定上限。

BASE_URL 必須與公開 URL 完全一致。若設定不符,當您登入時,應用程式會重新導向至錯誤的主機,導致工作階段 Cookie 被寫入至瀏覽器當前不在的網域,最終您將無錯誤訊息地回到登入頁面。

預設的 compose 檔案並未對外開放連接埠,因為預期前方會有反向代理。請加入覆寫設定,僅在 loopback 介面上發布預設的應用程式連接埠。

cat > compose.override.yml << EOF
services:
    plausible:
        ports:
            - 127.0.0.1:8000:8000
EOF

Matomo:完整產品與其所需的伺服器

Matomo 運行於 PHP 與 MySQL 或 MariaDB 之上,這意味著它適合傳統的網頁堆疊,而非容器堆疊。它也是此處唯一針對流量規模發布硬體建議的工具。

ChartMatomo sizing guidance by monthly pageviews
The data behind this chart
[
  {
    "label": "100K/month",
    "cpu_cores": 2,
    "ram_gb": 2,
    "disk_gb": 50
  },
  {
    "label": "1M/month",
    "cpu_cores": 4,
    "ram_gb": 8,
    "disk_gb": 250
  },
  {
    "label": "10M/month",
    "cpu_cores": 8,
    "ram_gb": 16,
    "disk_gb": 400
  }
]

以上為 Matomo 截至 2026 年 8 月發布的最低需求,並非本指南的實測數據。在每月 100,000 次瀏覽量以下,它要求 2 個 CPU 核心、2 GB RAM 與 50 GB SSD,且應用程式與資料庫共用同一台伺服器。在 1M/month 時,需求變為 8 GB RAM 與 250 GB 磁碟空間。在 10M/month 時,Matomo 建議使用兩台伺服器,最後一行顯示的是資料庫伺服器需求:16 GB RAM 與 400 GB 磁碟空間。請將這些磁碟數據與單一二進位檔案選項進行比較,後者將整個資料集儲存為單一 SQLite 檔案。

歸檔(Archiving)機制往往令人意外。預設情況下,Matomo 會在有人開啟儀表板時產生報表,因此隨著資料增長,儀表板會變慢並最終導致逾時。官方建議的解決方案是在一般設定中關閉瀏覽器觸發的歸檔功能,改為透過 cron 定期執行歸檔程式,並以擁有 Matomo 檔案的使用者身分,在 Matomo 目錄下執行。

php console core:archive --url=https://analytics.example.com

Matomo 會在處理後的報表資料表旁保留原始日誌資料表,並可依排程刪除舊的原始資料與報表。請在安裝時就啟用此功能,不要等到磁碟空間耗盡才處理。Matomo 亦可匯入伺服器存取日誌,使其成為此處唯一能同時涵蓋這兩類資料來源的產品。

Rybbit 與較新的技術堆疊

git clone https://github.com/rybbit-io/rybbit.git
cd rybbit
chmod +x *.sh
./setup.sh your.domain.name

Rybbit 是一款近期推出的軟體,具備現代化的儀表板。其安裝腳本會自動寫入環境設定檔,並透過 Docker Compose 啟動服務堆疊。該專案執行 ClickHouse,並內建 Caddy 作為網頁伺服器;Caddy 會佔用 443 埠並為您指定的網域名稱申請憑證。若伺服器上已有 Nginx 佔用 443 埠,該腳本將無法進行綁定,此時請改用專案提供的手動 Compose 部署方式,並將其置於現有的反向代理後方。根據官方文件,系統至少需 2 GB RAM,測試環境為 Ubuntu 24 LTS;若使用 ARM 架構,因 ClickHouse 的需求,處理器需為 ARMv8.2-A 或更新版本。

對於任何新興專案,必須誠實提醒:功能更新頻繁,且常伴隨破壞性變更。請務必鎖定版本標籤(tag),在執行 pull 更新前詳閱發行說明(release notes),並務必先備份資料庫。

保留期限與磁碟成長:自行測量

磁碟成長取決於工具針對每個事件儲存的資料量。GoatCounter 將點擊次數彙整為計數器,因此其檔案大小主要隨頁面與天數增加,而非原始流量。Umami 與 Matomo 則針對每個事件儲存一列資料,Matomo 更會在原始資料之上儲存處理後的報表資料表。ClickHouse 以欄位方式儲存事件並進行高壓縮,這也是為什麼 Plausible 能處理 row store 無法負荷的流量。

本指南不提供「每百萬次瀏覽量佔用多少 MB」的數據,因為我們無法測量您的流量。請自行測量。請根據您的 Compose 檔案調整服務名稱與使用者名稱。

du -h goatcounter-data/db.sqlite3
docker compose exec db psql -U umami -d umami -c "SELECT pg_size_pretty(pg_database_size('umami'));"
docker compose exec plausible_events_db clickhouse-client -q "SELECT formatReadableSize(sum(bytes_on_disk)) FROM system.parts WHERE active"

記錄當前數值,等待一週後再次記錄,並將差值除以儀表板顯示的該週瀏覽量。此數值反映了您的網站特性與機器人過濾效果,比任何公開的平均值更有參考價值。接著,請在數值尚小時設定保留期限。磁碟空間耗盡會導致 VPS 上所有服務停擺,而不僅僅是分析工具,這正是將資料庫儲存空間放置在 df -h 會監控之處的最強理由。若伺服器已存放大型檔案,此風險更需重視,因為 自架相片伺服器 耗盡磁碟的速度遠快於任何分析資料庫。

在反向代理與子網域後的運作方式

將收集器(collector)部署在受測網站的子網域下,例如 stats.example.com。如此一來,收集器的請求將被視為第一方(first party)請求,不會受到瀏覽器封鎖第三方請求規則的影響。

發布容器連接埠時,請將應用程式綁定至 loopback 位址。Docker 會在 ufw 之前寫入自身的防火牆規則,因此若以 -p 3000:3000 發布容器,即使 ufw status 顯示該連接埠已被拒絕,網際網路仍可存取該服務。請從另一台機器執行 curl http://SERVER_IP:3000 進行測試,您將能看到儀表板。若改以 -p 127.0.0.1:3000:3000 發布,相同的測試會顯示 Connection refused,此時僅有代理伺服器能存取該服務。

server {
    listen 443 ssl;
    server_name stats.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

在此情境下,轉發標頭(forwarding headers)是必要的。若缺少 X-Forwarded-For,所有造訪來源都會顯示為 127.0.0.1,導致國家/地區報告為空,且不重複訪客數(unique visitors)會被歸類為單一來源。各專案對於信任的標頭及其設定方式各有不同,請務必查閱該專案的代理伺服器說明文件,切勿直接假設。Caddy 會自動設定這些標頭,執行相同任務的 Caddyfile 僅需兩行設定。

stats.example.com {
    reverse_proxy 127.0.0.1:3000
}

若您尚未選擇代理伺服器,nginx、Caddy 與 Traefik 的比較 一文涵蓋了適合單機多子網域環境的選擇建議。

自架服務改變了資料的持有者,但並未改變法律對資料的規範。請區分兩項規則。ePrivacy 的同意規則規範的是在訪客裝置上儲存或讀取任何內容的行為,因此若工具不設定 Cookie 且不寫入任何資料至 local storage,則不受該特定要求限制。GDPR 規範的是個人資料處理,而 IP 位址屬於個人資料,因此您仍需具備合法的處理依據、設定資料保留期限,並在使用者詢問時提供其資料持有狀況。

Plausible、Umami、GoatCounter 與 Medama 預設皆不設定 Cookie。各專案所採用的替代識別方式各異,且會隨版本更新而變動,請務必閱讀各專案的隱私權說明文件,而非僅參考摘要。Matomo 提供 IP 去識別化功能以及可在管理介面啟用的 opt out 端點。

各國監管機構的結論不盡相同。例如,法國的 CNIL 公布了受眾測量可豁免取得同意的條件。本節僅為事實摘要,不構成法律建議。若為擁有實際使用者的網站,請諮詢您所在司法管轄區的律師。

大眾常忽略的一點是:存取日誌同樣屬於個人資料。GoAccess 不會在頁面中加入任何 script,但仍會處理 IP 位址,因此基於日誌的分析工具並非自動排除在規範之外。

廣告攔截器與數據下降的原因

過濾清單會比對主機名稱與 URL 模式。託管式分析產品很容易被比對出來,因為所有人都是從同一個知名主機名稱載入它。將收集器移至您自己的子網域可從請求中移除該主機名稱,而從您自選的路徑提供腳本則可移除該知名檔名。兩者都會改變過濾清單的比對目標。

本文不主張任何命中率,因為本文並未進行測量。攔截特定設定的訪客比例取決於您的受眾,開發者受眾的攔截比例遠高於一般受眾。請改為測量您自己的數據落差。在同一週內,使用 GoAccess 計算存取日誌中的 HTML 頁面請求數,並將其與您的腳本工具所報告的瀏覽量進行比較。兩者之間的差異即為被攔截的造訪次數,加上從您網站快取中提供的頁面數。

當您從託管產品切換時,預期總數會發生變動,且預期部分變動與攔截無關。不同產品對於「瀏覽量」的定義、單頁應用程式(SPA)內的路由變更是否計入,以及工作階段何時結束,皆有不同見解。在斷定流量下降之前,請先比較跨週的趨勢。

如何選擇適合的網站工具

  • 個人網站或每月瀏覽量約 50,000 次以下的部落格:使用 GoatCounter 或 Medama,部署於 1 GB RAM 的 VPS,並以檔案複製方式進行備份。
  • 無法新增指令碼,或受眾高度阻擋追蹤的網站:使用 GoAccess 定期分析現有的存取日誌。
  • 有專人需查看儀表板的小型企業網站:使用 Umami,並搭配其 Postgres 容器。
  • 需要設定目標與漏斗分析,且伺服器記憶體在 2 GB 以上的網站:使用 Plausible Community Edition;若偏好較新的儀表板且能接受專案較新,則可選擇 Rybbit。
  • 擁有多個網站、多個使用者帳號,或需依據自訂保留政策管理原始資料的環境:使用 Matomo,並依據其官方發布的建議規格配置資源。

請從能解決您當前需求的最輕量工具開始。日後從 GoatCounter 遷移至 Plausible 僅需更換子網域並損失部分歷史資料;但若從 Matomo 遷移至其他工具,將會面臨極為繁瑣的資料轉移過程。若您仍在評估該伺服器還能部署哪些服務,更廣泛的自架服務總覽 涵蓋了可與其共存的應用;若您的需求並非訪客統計,而是應用程式層級的請求追蹤,則 自架可觀測性服務 才是符合該需求的工具。

FAQ

不需要,這是兩回事。ePrivacy 指令規範的是在訪客裝置上儲存或讀取資料,因此若工具不設定 Cookie 且不寫入任何資料至 local storage,則不受該規範限制。GDPR 則是另一項規範,涵蓋個人資料處理;由於 IP 位址屬於個人資料,即便不使用 Cookie,您仍需具備合法依據並遵守資料保留期限。自架會將資料移至您的伺服器,使您成為該資料的負責方。請查閱您所在地區監管機構的指引,並針對您的個案諮詢法律專業人士。

在 VPS 上自架分析工具需要多少 RAM?

這取決於資料儲存方式,而非儀表板本身。GoatCounter 與 Medama 以單一處理程序運作並使用單一檔案,Medama 文件指出小型網站可在 256 MB 的機器上執行。Umami 則會在 Node 應用程式旁增加一個 Postgres 容器。Plausible Community Edition 與 Rybbit 皆使用 ClickHouse,兩者皆要求至少 2 GB RAM。Matomo 官方指引建議每月 100,000 次瀏覽量需配置 2 個 CPU 核心與 2 GB RAM。

為什麼自架工具的數據比原本使用的分析工具低?

原因有二,且皆為實際情況。過濾清單會阻擋部分收集請求,因此所有基於指令稿(script)的工具都會遺失這些造訪。此外,各產品的計算方式不同,對於「頁面瀏覽量」的定義以及「工作階段結束」的時機點各有差異。請將您 access log 中一週的 HTML 頁面請求數,與同一週內基於指令稿的瀏覽量進行比較。兩者的差距即為被阻擋的造訪加上被快取的頁面,這是根據您網站實際測量的數據,而非參考他人的公開比例。

我可以在 ARM 架構的 VPS 上執行 Plausible 或 Rybbit 嗎?

兩者皆執行 ClickHouse,而 ClickHouse 在 x86 架構上需要 SSE 4.2,在 ARM 架構上則需要 NEON。Plausible 的需求明確提及此點,Rybbit 文件則指出 ARM 系統需為 ARMv8.2-A 或更新版本。目前的 ARM 伺服器核心皆符合此標準,舊款則否;若不符合,ClickHouse 會因指令集錯誤而無法啟動,這類錯誤通常不會出現在應用程式日誌中。若使用小型 ARM 裝置,選擇單一檔案工具可避開此問題,因為它們皆不使用 ClickHouse。

我應該解析伺服器日誌,還是使用追蹤指令稿?

當您無法加入指令稿、目標客群大量阻擋追蹤,或是您希望統計包含爬蟲在內的數據時,請使用日誌解析。GoAccess 可讀取伺服器已產生的日誌,因此不會增加頁面負載,也不需要資料庫。但您會失去所有發生在瀏覽器內部的資訊,且無法統計從 CDN 或瀏覽器快取載入的頁面,因為這些請求並未到達您的伺服器。許多網站會同時採用這兩種方式,並將其視為兩種不同的測量指標。