本文约 6,841 字,预计阅读 18 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:Cookie 横幅一弹,跳出率涨了 12%,数据还少了三成
Google Analytics 带来的困扰在近三年被放大了三倍:合规成本(GDPR/《个保法》要求单独同意,且 EU 多国 DPA 对 GA 跨境传输有明确限制,奥地利、法国、意大利都曾认定使用 GA 违法)、数据被拦截(广告拦截器对 google-analytics.com 的拦截率在国内 5%~15%,欧洲部分地区超过 30%)、用户反感(Cookie 横幅带来的跳出损失可以量化:很多站点 A/B 测试后发现,弹 consent banner 后跳出率上升 5%~15%)。
隐私友好统计(privacy-friendly analytics)就是在这个背景下火起来的。它的技术立场很鲜明:不写 cookie、不采集跨站信息、不做用户级画像、数据自治。代表产品是 Matomo(前身 Piwik,PHP + MySQL 自建为主,也有官方云)与 Plausible(Elixir + ClickHouse,开源自托管或官方 SaaS)。两者都提供官方 WordPress 插件,接入成本接近装 GA。
本文重点讲自托管场景的真实部署细节:服务器要求、CDN 放通、数据库膨胀、cookieless 模式的取舍,以及和 GA4 数据如何对齐。
原理分析:同一份数据,两种不同的存储哲学
| 维度 | Matomo(自托管) | Plausible(自托管) |
|---|---|---|
| 技术栈 | PHP 8.x + MySQL/MariaDB | Elixir + PostgreSQL + ClickHouse |
| 部署难度 | 低,跟装 WordPress 一样 | 高,需 Docker Compose 整套 3~5 个容器 |
| WordPress 插件 | 官方 Matomo Analytics(把 tracking code 注入 + 后台报表内嵌) | 官方 Plausible Analytics(注入 script + 可选 proxy) |
| 报表颗粒度 | 细,支持漏斗、热力、session recording(付费) | 极简,只有仪表盘一页 + 目标转化 |
| cookieless | 支持(disableCookies) |
默认就是 cookieless |
| 资源占用 | 中等,PV 大时需分库归档 | ClickHouse 极省空间,但内存底线 2 GB |
关键差异点在于唯一访客(unique visitor)的计算方式。GA/Matomo 默认用第一方 cookie 里的 visitor ID 识别回访;Plausible 与 Matomo 的 cookieless 模式则改用「IP + User-Agent + 每日盐值哈希」生成一个当天有效的会话 hash。这意味着:同一用户跨天会被算成两个 unique visitor;同一局域网的多台设备可能被算成不同访客。这是隐私友好的代价——你不能再精确追踪”这个用户第三次来了”。对于内容站点(看趋势而非做再营销)这通常可以接受。
另外必须理解:Matomo 自托管的数据写入是同步的。matomo.php 每次命中都在 MySQL 里写 matomo_log_* 表,日 PV 超过 5 万的表会迅速膨胀,必须配置归档(archiving)cron。这是自托管最大的运维负担。
保姆级实操
步骤 1:环境准备与 Matomo 安装
# Matomo 最低要求:PHP 8.0+、MySQL 5.7+/MariaDB 10.2+
php -v
mysql --version
# 下载并解压到子目录(与 WordPress 同级便于共享 CDN)
wget https://builds.matomo.org/matomo-latest.zip -O /tmp/matomo.zip
unzip -q /tmp/matomo.zip -d /var/www/example.com/
mv /var/www/example.com/matomo /var/www/example.com/stats
chown -R www-data:www-data /var/www/example.com/stats
Nginx 里给 stats 目录一个独立的 server block 或 location:
location ^~ /stats/ {
root /var/www/example.com;
index index.php;
try_files $uri $uri/ /stats/index.php?$query_string;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# 追踪接口不要被缓存
location = /stats/matomo.php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
}
步骤 2:WordPress 侧安装官方 Matomo 插件
后台搜索安装 Matomo Analytics(作者 Matomo),激活后它会:
- 读取/注入 tracking code(需要填写 Matomo URL 与 Site ID)
- 在 wp-admin 内嵌报表(依赖
matomo.php的 Reporting API) - 自动触发归档任务(可选)
如果已自托管,选择「Self-hosted」,填入 https://example.com/stats/ 与 token_auth。
步骤 3:Plausible 自托管(Docker Compose)
# docker-compose.yml —— Plausible Community Edition 官方示例简化版
services:
plausible_db:
image: postgres:14-alpine
restart: always
volumes: [ "db-data:/var/lib/postgresql/data" ]
environment:
- POSTGRES_PASSWORD=postgres
plausible_events_db:
image: clickhouse/clickhouse-server:24.3-alpine
restart: always
volumes:
- event-data:/var/lib/clickhouse
- ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
plausible:
image: ghcr.io/plausible/community-edition:v2.1.1
restart: always
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"
depends_on: [ plausible_db, plausible_events_db ]
ports: [ "8000:8000" ]
environment:
- BASE_URL=https://stats.example.com
- SECRET_KEY_BASE=<自行生成随机长字符串,切勿使用示例值>
- DATABASE_URL=postgres://postgres:postgres@plausible_db:5432/plausible_db
- CLICKHOUSE_DATABASE_URL=http://plausible_events_db:8123/plausible_events_db
volumes:
db-data:
event-data:
# 生成 SECRET_KEY_BASE(不要用示例值)
openssl rand -base64 48
步骤 4:WordPress 接入 Plausible
官方 Plausible Analytics 插件(wordpress.org 可搜到)支持自托管域名:设置页里填自托管域名 stats.example.com,并勾选 proxy through WordPress——这是关键一步,它让追踪脚本走自己的域名发出,避免被第三方拦截器拦掉。
// 手工注入(不想用插件时可以这样,放进主题的 header.php)
add_action( 'wp_head', function () {
?>
<script defer data-domain="example.com" data-api="/wp-json/plausible/v1/event" src="/assets/js/plausible.js"></script>
<?php
} );
步骤 5:Matomo 开启 cookieless(合规要求时)
// 若用手工注入取代插件的 API 注入,可这样关闭 cookie
add_action( 'wp_head', function () {
?>
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']); // 不写 cookie
_paq.push(['setDoNotTrack', false]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u = "https://example.com/stats/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '1']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s);
})();
</script>
<?php
} );
注意:disableCookies 之后不要开 User ID /Visitor profile 之类的功能,它们依赖 cookie 持久 ID。
步骤 6:必须配置的归档 cron(Matomo 自托管核心运维)
# 每天凌晨 2 点归档:不跑的话后台报表打开会超时、前台注入会拖慢渲染
0 2 * * * /usr/bin/php /var/www/example.com/stats/console core:archive \
--url=https://example.com/stats/ > /var/log/matomo-archive.log 2>&1
# 可选:大站用 WP-CLI 风格的批次控制,或每小时归档昨天的数据
常见踩坑
- Cloudflare 把 matomo.php 的请求缓存/拦截:需要在 CDN 里为
/stats/matomo.php设置 “Cache Level: Bypass”,并确认 WAF 不把POST的 collect 请求当成攻击。 - 案例:某站点把 Matomo 装在和 WordPress 同一台 1C2G 的小水管上,跑了三个月后
matomo_log_visit表涨到 6 GB,MySQL 慢查询刷屏,WordPress 前台 TTFB 从 300 ms 涨到 2.8 秒。排查发现归档 cron 从来没成功执行过(php-cli 的memory_limit太低导致--force-all-websites中途 OOM)。最后同时做了三件事:把归档 cron 拆成每小时跑一次、增加matomo_log_*的按月清理任务(保留 6 个月明细,历史用归档表)、Matomo 迁到独立数据库实例。教训:自托管统计本身就是一套数据库服务,务必给它单独的备份与容量规划。 - Matomo 后台报表在 wp-admin 里加载超时:Reporting API 需要 token_auth 权限,且服务器时区与 MySQL 时区必须一致,时区不一致时会出现 “No data”,非常容易被误判为没采集。
- SECRET_KEY_BASE 用了示例值/弱值:Plausible 允许 Linux upstream 后首次直接起飞(不可接受的风险)。必须用
openssl rand -base64 48生成,且不进版本库。 - data-domain 填错导致 404 上报:Plausible 要求
data-domain与仪表盘里添加的站点完全一致(不含https://、不含尾斜杠)。 - 忽略 DoNotTrack / 拒绝 NPA:Matomo 默认尊重浏览器的 DNT 头。如果你想统计这部分流量要在后台关掉 DNT,但那样会削弱”隐私友好”的宣传价值,需谨慎。
- 移动 App 内嵌 WebView 丢失 referrer:和 GA 一样的问题,需要自己补
referrer参数,不要指望默认。 - 两个平台数据打架:Matomo 和 GA4 的会话定义不同(GA4 默认 30 分钟不活动算新会话,Matomo 默认 30 分钟且凌晨 4 点切分)。对比时要接受 5%~20% 的差值,把它写成团队共识,别浪费时间对齐。
延伸阅读:Chrome Core Web Vitals 优化、WordPress 隐私合规设置
总结
决策口径:想要细颗粒度报表 + 愿意承担数据库运维 → Matomo 自托管(PV 超过 5 万/日请务必拆库 + 归档 cron);只想要一张趋势图、服务器内存 ≥2 GB、会用 Docker → Plausible CE;完全不想运维 → Plausible 官方 SaaS 或 Matomo Cloud(付费免运维)。无论选哪种,落地后请做三件事:①在 CDN 里放通追踪接口并禁用缓存;②Matomo 必须配归档 cron 和数据保留策略;③由 cookieless 带来的会话口径差异导致的 “unique visitor 偏高”,要写进内部口径,避免用它评价投放效果。
