搜索全站
插件 18 分钟阅读

Matomo 与 Plausible 自建统计接入 WordPress:隐私友好方案部署实践

不想接 GA4,又想保留数据主权?本文讲清 Matomo(自托管 + 官方插件)与 Plausible(官方 WordPress 插件)两种隐私友好统计的部署方式,包含 cookieless 模式、CDN 放通、数据库膨胀处理与数据抽样对比。

U
UFO_PF 2020-10-23 · 阅读 18 分钟
Ma 插件
阅读提示
本文约 6,841 字,预计阅读 18 分钟。文中命令与配置均经过实测,可直接参考执行。

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 风格的批次控制,或每小时归档昨天的数据

常见踩坑

  1. Cloudflare 把 matomo.php 的请求缓存/拦截:需要在 CDN 里为 /stats/matomo.php 设置 “Cache Level: Bypass”,并确认 WAF 不把 POST 的 collect 请求当成攻击。
  2. 案例:某站点把 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 迁到独立数据库实例。教训:自托管统计本身就是一套数据库服务,务必给它单独的备份与容量规划。
  3. Matomo 后台报表在 wp-admin 里加载超时:Reporting API 需要 token_auth 权限,且服务器时区与 MySQL 时区必须一致,时区不一致时会出现 “No data”,非常容易被误判为没采集。
  4. SECRET_KEY_BASE 用了示例值/弱值:Plausible 允许 Linux upstream 后首次直接起飞(不可接受的风险)。必须用 openssl rand -base64 48 生成,且不进版本库。
  5. data-domain 填错导致 404 上报:Plausible 要求 data-domain 与仪表盘里添加的站点完全一致(不含 https://、不含尾斜杠)。
  6. 忽略 DoNotTrack / 拒绝 NPA:Matomo 默认尊重浏览器的 DNT 头。如果你想统计这部分流量要在后台关掉 DNT,但那样会削弱”隐私友好”的宣传价值,需谨慎。
  7. 移动 App 内嵌 WebView 丢失 referrer:和 GA 一样的问题,需要自己补 referrer 参数,不要指望默认。
  8. 两个平台数据打架: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 偏高”,要写进内部口径,避免用它评价投放效果。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。