网站统计方案横向对比

GA4、Umami、Plausible、Cloudflare Web Analytics、GoAccess、Counterscale、GoatCounter、Clarity、PostHog 九个方案逐个拆开比,外加决定它们成败的 uBlock Origin。附脚本体积、大陆可达性、拦截规则三组实测数据

本站到今天为止一个统计脚本都没装,实在是难以抉择使用哪个,需要权衡内存占用,网络可达性,还需要精细化统计。趁这次把候选名单里的方案全部分析一下。

这些工具的差别不在功能列表,而在「数据采集位置」。采集位置一旦定了,可达性、拦截、加载开销、颗粒度四个维度就基本被决定了,剩下的都是包装。

采集位置分类

四个采集位置,几乎解释了后面所有差异。

采集位置谁在用用户拦得住吗能拿到什么
浏览器 JSGA4、Umami、Plausible、CF WA、GoatCounter、Clarity、PostHog、Counterscale拦得住,且默认就拦屏幕、性能、滚动、点击、会话行为
服务端中间件 / SDKGoatCounter API、Counterscale server 模块、PostHog 后端 SDK、Plausible Events API拦不住请求级信息,拿不到前端行为
Web 服务器日志GoAccess、GoatCounter 的日志导入拦不住全部请求,含爬虫与静态资源
边缘 / CDNCounterscale(跑在 Workers)、CF WA(边缘自动注入 beacon)注入端拦不住,beacon 本身照拦取决于最终是谁在上报

九个方案简介

GA4(Google Analytics 4)

行业默认值,功能上限最高:事件模型可以把任何动作建模成 event,配合自定义维度、受众、归因、跨端(Web + App)打通。免费版的硬限制查得到:每事件 25 个参数、30 个关键事件、每媒体资源 50 个事件级自定义维度、数据最长保留 14 个月、探索报告每次查询 1000 万事件的抽样上限。

三个代价很实在:

1、最大的脚本。实测 gtag.js 压缩后 145 KB、解压 409 KB,是本文所有方案里最重的,比第二名还大 80%

2、最招拦截。EasyPrivacy 里 ||googletagmanager.com^ 是无条件整域拦截,不带任何例外条件

3、大陆能采集到吗。能采到,但不完整、也不稳定,不能当成国内流量的准确口径

Umami(自托管)

MIT,TypeScript,3.8 万 star,现在是自托管统计里最主流的一个。官方要求:Node.js 18.18+ 与 PostgreSQL 12.14+,Docker Compose 一条命令能起

颗粒度覆盖页面、来源、设备、浏览器、系统、国家、UTM,加上自定义事件与事件属性;文档里还列了目标、漏斗、用户路径(Journey)、留存、收入归因,以及会话回放与热图。脚本实测压缩后 2.3 KB,非常轻。

代价是它是这批里常驻服务最重的之一:一个 Next.js/Node 进程加一个 PostgreSQL,一台 1 GB 内存的小机器跑起来会紧张。

Umami Cloud(托管版)

官方托管,省掉数据库和升级。截至 2026-08-19 的档位:

档位价格事件额度站点数数据保留
Hobby$0 / 月10 万 / 月1 个6 个月
Pro$20 / 月100 万 / 月20 个2 年
Business$200 / 月1000 万 / 月不限5 年

会话回放与热图在 Business 档才有;官方 FAQ 明说云版比自托管多出来的是邮件报表与 streaming API。

免费档 1 个站点、6 个月保留,对个人博客刚好够,但要留意超额是继续采集然后按量计费,不是停掉。

Plausible(自托管 CE)

Elixir 写的,2.9 万 star,主程序 AGPL-3.0,部署仓库 community-edition 是 MIT。脚本实测压缩后 1.3 KB,全场最小

指标设计是这批里最考究的:独立访客、会话、跳出率、访问时长、单页停留时长、滚动深度、退出率、来源与 Channel 分组、UTM 全套、国家/地区/城市、目标与转化率、漏斗、用户路径、自定义属性。

自托管的门槛在依赖:PostgreSQL 加 ClickHouse,官方要求 CPU 支持 SSE 4.2 或 NEON 指令集(ClickHouse 的硬要求),推荐至少 2 GB 内存。这已经不是「顺手在博客服务器上多起一个服务」的量级了。

Cloudflare Web Analytics

免费,所有套餐可用。原理是一段 RUM beacon,用 Performance API 采数据;站点如果已经过 Cloudflare 代理,可以在边缘自动注入,连改模板都省了。

它的独门优势是性能维度:LCP、CLS、INP、TTFB、FCP 全套 Core Web Vitals,外加导航计时、资源计时、Server-Timing。可筛选的维度是国家、Host、路径、来源、设备类型、浏览器、操作系统、站点、导航类型(能区分「走没走缓存」这种别处没有的信息),并且带一个 Exclude Bots 开关。

不足是没有自定义事件、没有会话概念——它是「网页表现监测」而不是「用户行为分析」。脚本 11 KB,比同类重,因为里面塞了 Google 的 web-vitals 库。

GoAccess

彻底的另一条路:它不在页面上放任何东西,直接读 nginx / Apache / Caddy / CloudFront 的访问日志。C 写的老牌工具,MIT,唯一依赖是 ncurses,可以在终端里实时刷,也能生成一个自包含的 HTML 面板。

它的三条优势别的方案给不了:

1、零加载开销、零拦截——访客那边一个字节都没多下。装 uBO 也好、关 JS 也好、curl 也好,全都统计得到。

2、能看到别人看不到的东西:状态码分布、慢请求、带宽消耗、爬虫、虚拟主机、ASN 归属。查故障和查恶意流量时,这些比 PV 有用得多。

3、历史数据是现成的——日志一直在,装上当天就能回看过去几个月。

代价同样明确:拿不到任何前端信息(屏幕、停留、滚动、点击一概没有),而且默认统计到的是「请求」不是「人」——爬虫、预取、CDN 回源全在里面,需要自己过滤。同一出口 IP 后面几个人也分不开。

Counterscale

MIT,跑在 Cloudflare Workers + Workers Analytics Engine 上的自部署统计npx @counterscale/cli install 一条命令装完。作者的说法是 Cloudflare 免费额度大约能撑到每天 10 万次命中。

它是「自托管」里唯一不需要服务器的:没有数据库、没有常驻进程、没有升级维护,成本趋近于零。脚本实测压缩后 1.9 KB,另外提供服务端模块(@counterscale/tracker/server),可以完全绕开浏览器上报。

它的代价:

只有 90 天。这是 Analytics Engine 的硬保留期,README 写得很直白:面板「只能显示最近 90 天」。R2 里那份 Apache Arrow 归档是冷存,面板查不到,要看得自己把文件拉下来分析。

维度比想象中窄。读 schema.ts 的列映射:host、userAgent、path、country、referrer、browserName、browserVersion、deviceModel、deviceType、UTM 五件套。没有操作系统、没有屏幕尺寸、没有语言,地理只到国家。也没有自定义事件——数据点结构是写死的,只有 pageview。

GoatCounter(自托管)

Go 写的单个静态二进制,EUPL-1.2,数据库用 SQLite 就够,goatcounter serve 一条命令起服务,连 TLS 与 ACME 自动签证书都内置了。这是本文里部署最轻的自托管方案,没有之一。

它真正的过人之处是三种采集方式都支持:JS 脚本、无 JS 的图片像素、后端中间件调 API,外加从 nginx/Apache/Caddy/CloudFront 日志导入。也就是说被拦截器挡住的那部分,可以用日志导入补回来——这个组合别家没有。

维度是浏览器、系统、屏幕尺寸、地理位置、来源、campaign,用不可还原的哈希在不写 cookie 的前提下识别独立访问。脚本实测压缩后 3.3 KB

GoatCounter 托管版(goatcounter.com)

同一个程序的官方托管,「对合理的公开用途免费」,靠 GitHub Sponsors 捐助维持,官方原话是跑个人网站或中小企业没问题、每天几百万 PV 就别来了。对个人博客这是全场性价比最高的选项之一。

但对大陆站点它基本不可用。实测:主站 www.goatcounter.com 通(1–3 秒),脚本 CDN gc.zgo.at 五次全部超时。查 DNS 就明白了:

$ nslookup gc.zgo.at            # 用 8.8.8.8
Addresses:  2a03:2880:f10a:83:face:b00c:0:25de     ← Facebook 的地址段
            104.244.46.52                          ← Twitter 的地址段

解析结果被投毒到了社交平台的 IP 上,TCP 必然握不上手。后台能看,脚本加载不了,大陆访客一个都统计不到。 自托管版不受影响,这是托管版独有的问题。

Microsoft Clarity

它和上面所有工具不是一个品类:不是流量统计,是行为分析。官方支持的功能是会话录制、热图、事件与漏斗、Copilot 摘要。官方文档写得很直白:「Clarity is a free service forever」,没有付费档要升。

想知道「读者读到第几屏关掉的」「哪个按钮被反复点却没反应」,只有这类工具能回答,前面九个都不行。

代价是它是隐私尺度最大的一个——录制的是访客的真实操作。脚本压缩后 25 KB,且录制期间持续上传。EasyPrivacy 里 ||clarity.ms^ 是整域拦截。另外官方明确要求:不得用于面向 18 岁以下用户的网站与应用。

好消息是它的可达性最好:大陆实测脚本 0.6–0.8 秒、后台 3 秒左右,全部通过,是所有需要登录后台的方案里表现最好的。

PostHog

产品分析全家桶:事件、漏斗、留存、路径、群组、特性开关、A/B 测试、会话回放、错误跟踪。对 SaaS 产品是好东西,对博客是杀鸡用牛刀。

自托管这条路官方自己在劝退,文档原话是云版「对绝大多数用户体验好得多」,并且列了硬要求:4 vCPU、16 GB 内存、30 GB+ 存储;不提供任何技术支持;所有付费功能仅限云版;超过每月 30 万事件或 1000 条录像就需要专业运维能力。

脚本 array.js 实测压缩后 80 KB,仅次于 GA4,而且开会话回放还要再加载 recorder。大陆实测:脚本域通(3.7–5.9 秒),后台 us.posthog.com 通但慢到接近不可用——单次登录页要下 50 万字节,三次里两次在 20 秒内没下完。

三组实测数据

以下三组是本文唯一的原创数据,测于 2026-08-19。可达性那一栏是在中国大陆家庭宽带上直连、不走任何代理测的,换运营商换时段结果会变,只能当参考不能当结论。

脚本体积

用 curl 带 --compressed 直接拉线上文件测的,「解压后」是原始字节数。

方案压缩后解压后备注
GA4 gtag.js145 KB409 KB还要另发 collect 请求
PostHog array.js80 KB250 KB开录像还要加载 recorder
Clarity clarity.js25 KB72 KB录制期间持续上传
CF Web Analytics beacon.min.js11 KB31 KB内含 Google 的 web-vitals 库
GoatCounter count.js3.3 KB9.0 KB官方自称「约 3.5 KB」,属实
Umami script.js2.3 KB4.6 KB
Counterscale tracker.js1.9 KB4.8 KB
Plausible script.js1.3 KB2.8 KB全场最小
GoAccess00页面上什么都没有

GA4 一个脚本,等于 111 个 Plausible。 这个差距在手机弱网上是能被感知到的。

大陆可达性

方案采集脚本管理后台
GA4通,0.7 秒(上报端点也通,返回 204)五次全败
Umami Cloud通,2.4–7.4 秒通,2.9–8.2 秒(慢)
Cloudflare WA通,1.0–3.1 秒
Plausible 云版通,1.2–5.3 秒,偶发失败通,偶发失败
GoatCounter 托管版五次全败(DNS 被投毒)通,1.3–2.9 秒
Clarity通,0.6–0.8 秒通,2.8–7.8 秒
PostHog 云版通,3.7–5.9 秒通但极慢,三次里两次 20 秒未加载完
Counterscale(默认 workers.dev六次全败(DNS 被投毒)同左
Counterscale(绑自有域名)通,2.9 秒(走 CF 正常 anycast)同左
自托管三件套取决于你自己的服务器同左

拦截规则

把三份主流规则文件抓下来直接搜:EasyPrivacy(uBO 默认订阅)、uBO 自家的 privacy 列表、AdGuard 的追踪保护列表。

方案规则里的处境
GA4googletagmanager.com 整域无条件拦截;google-analytics.com 另有脚本级规则
Clarityclarity.ms 整域拦截
Cloudflare WAstatic.cloudflareinsights.comcloudflareinsights.com 都在列
Umami Cloudumami.is 第三方拦截
Plausible 云版plausible.io 第三方拦截,另有 plausible.io/js/plausible. 等路径规则
GoatCounter 托管版goatcounter.com 第三方拦截,规则里还专门写了一行注释点名
PostHogi.posthog.comapp.posthog.com/static/array.js 等多条
Counterscale一条都没有
GoAccess不适用(页面上没有东西可拦)

真正值得警惕的是自托管也跑不掉。 规则里有一批通配写法,专打「按默认方式部署」的自建实例:

||umami.*/script.js|$script          ← 任何 umami. 开头的域名下的 script.js
://plausible.*/js/script.            ← 自建 Plausible 的默认脚本路径
://plausible.*/api/event|            ← 连上报接口一起拦
/plausible/*.js$script               ← 反代到 /plausible/ 路径同样命中
/posthog/ingest/*                    ← PostHog 的常见反代路径

通配之外还有逐个点名。把三份列表合起来去重,数了一下被单独写进规则的自建实例域名:

品牌被点名的独立域名数
Plausible114
Matomo20 个
GoatCounter15 个
Umami12 个
PostHog5 个
Counterscale0 个

plausible.safing.ioumami.vidfast.proposthog.tarnkappe.info 这类条目一条条躺在文件里。所以「我自建就没人拦得到」是幻觉——只要按默认命名部署、站点又有点流量,被人报上去写进规则只是时间问题。

五、五个维度的总账

方案托管采集位置服务端开销被拦脚本颗粒度
GA4三方浏览器 JS必被拦145 KB最高(事件模型 + 归因 + 跨端)
Umami 自托管自建浏览器 JSNode + PostgreSQL2.3 KB高(事件 + 漏斗 + 路径 + 留存)
Umami Cloud三方浏览器 JS2.3 KB同上,回放热图要 $200 档
Plausible CE自建浏览器 JSClickHouse + PG,≥2 GB会(点名最狠)1.3 KB高(含滚动深度、退出率)
Cloudflare WA三方浏览器 JS / 边缘注入11 KB中,性能维度独一份
GoAccess自建服务器日志极低(C,只依赖 ncurses)拦不到0请求级全景,无前端行为
Counterscale自建Workers零服务器目前无规则1.9 KB基础,只留 90 天
GoatCounter 自托管自建JS / 像素 / 中间件 / 日志导入极低(单二进制 + SQLite)JS 那条会3.3 KB
GoatCounter 托管版三方浏览器 JS3.3 KB中,大陆采不到
Clarity三方浏览器 JS25 KB行为级(录制 + 热图)
PostHog 云版三方浏览器 JS + 后端 SDK80 KB最高(产品分析全家桶)
PostHog 自托管自建同上4 vCPU / 16 GB80 KB同上

六、怎么选

按最在意的那一条走:

1、要一个诚实的访客数,不想被拦,不想加载任何东西 → GoAccess。日志已经在那儿了,装上就能回看历史,代价是拿不到任何前端信息。

2、既要前端维度、又不想被拦漏太多 → GoatCounter 自托管:JS 脚本正常采,再定期把 nginx 日志导进去补上被拦掉的部分。这是唯一能把两条路合并的方案。

3、不想维护服务器,站点已在 Cloudflare 后面 → Cloudflare Web Analytics。免费、边缘注入不用改模板,还白送 Core Web Vitals。

4、想要漂亮面板和事件分析,愿意养一个服务 → Umami 自托管(Node + PostgreSQL),或者懒一点直接上 Umami Cloud 免费档。

5、一台服务器都不想有,也不想付钱 → Counterscale,跑在 Workers 上成本趋近于零,代价是数据只留 90 天、维度基础。

6、想知道读者到底怎么读的 → Clarity,和上面任意一个并存。它回答的是别人回答不了的问题。

7、做的是产品不是博客 → PostHog 云版,自托管那 16 GB 的要求不值得。

8、必须用 GA4(要接广告,或者甲方要求)→ 接受它 145 KB 的体积和必被拦的现实

提示

我也不知道怎么选,网站应该没啥流量,分析那么多也没啥用(暂时)

评论

评论加载中……

登录后再评论

注册要用邮箱收个验证码,只为确认邮箱能收信,不会拿去做别的。账号设置