站点统计方案:自建统计还是用现成的

想看看有多少人来访问、看哪几篇,是人之常情。但每加一个统计脚本,就多一份外部依赖和隐私成本。

一、四类方案

类型代表特点
全能分析Google Analytics 4功能最强,最重
免 Cookie 统计Cloudflare Web Analytics零配置,免费,隐私友好
自建轻量Plausible / Umami数据自控,需服务器
日志分析goaccess / awk零前端脚本,最原始

二、Google Analytics

html
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag("js", new Date());
  gtag("config", "G-XXXX");
</script>
优点缺点
功能全面(漏斗、事件、转化)脚本体积大(~50KB+)
免费拖慢 LCP
生态和文档丰富隐私合规麻烦(需 Cookie 同意横幅)
数据被广告拦截器屏蔽(比例很高)

对个人技术站来说,GA 的功能 90% 用不上,代价却是实实在在的性能和隐私负担。

三、Cloudflare Web Analytics(推荐入门)

如果站点已经在 Cloudflare 后面,这是最省事的:

bash
1. CF 控制台 → Web Analytics → 添加站点
2. 复制一段 JS(约 3KB,或直接用 DNS 方式零 JS)
3. 等待数据

特点:

  • 不使用 Cookie,不需要同意横幅;
  • 脚本很小,对性能影响可忽略;
  • 免费;
  • 提供 PV、UV、来源、Top 页面、国家分布;
  • 甚至有 Core Web Vitals 数据。

缺点:功能简单(没有事件追踪、没有漏斗);依赖 Cloudflare。

还有 零 JS 模式:只在 DNS 里加一条 CNAME,CF 通过代理请求统计,页面完全不加脚本。这是最干净的方案。

四、自建 Plausible / Umami

想要「数据在自己手里」,自建是正解。

Umami(推荐,资源占用小)

yaml
# docker-compose.yml
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    container_name: umami
    restart: always
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:密码@db:5432/umami
      APP_SECRET: 一串随机字符串
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    container_name: umami-db
    restart: always
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: 密码
    volumes:
      - umami-data:/var/lib/postgresql/data

volumes:
  umami-data:
bash
docker compose up -d
# 默认账号 admin / umami,登录后立刻改密码!

Nginx 反代:

nginx
server {
    listen 443 ssl http2;
    server_name stats.bzii.cn;
    ssl_certificate     /etc/letsencrypt/live/stats.bzii.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/stats.bzii.cn/privkey.pem;
    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;
    }
}

页面里加:

html
<script defer src="https://stats.bzii.cn/script.js"
        data-website-id="你的站点ID"></script>
优点缺点
数据完全自控要维护一个服务(数据库 + 应用)
不用 Cookie数据量大时数据库会增长
脚本约 2KB被广告拦截器屏蔽(可自建域名缓解)

五、日志分析:零前端脚本

最「干净」的方案:不改页面,直接分析 Nginx 日志。

bash
sudo apt install -y goaccess

# 交互式查看
goaccess /var/log/nginx/access.log --log-format=COMBINED

# 生成 HTML 报告
goaccess /var/log/nginx/access.log -o /tmp/report.html \
  --log-format=COMBINED --real-time-html

# 日常用 awk 也够
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
优点缺点
零前端脚本,不影响性能看不到「独立访客」(只能近似)
不泄露访客数据给第三方爬虫流量会算进去,数据偏大
能看到爬虫、404、慢请求没有来源、停留时长

详见「Nginx 访问日志分析」那篇。对我这种想看「哪篇最受欢迎」的需求,awk 完全够。

六、对比

方案前端脚本隐私维护适合
GA4~50KB需同意横幅0商业站
CF Web Analytics~3KB 或 00大多数个人站
Umami 自建~2KB想自控数据
日志分析0最好只要看趋势

七、隐私与合规要注意

  1. 境内站点:收集个人信息需要隐私政策说明;
  2. 使用 Cookie 的统计(GA)需要同意横幅(GDPR 要求);
  3. 不要用统计脚本采集表单内容、搜索词等敏感信息;
  4. 如果用第三方统计,隐私政策里要说明。
html
<!-- 本站的做法:不加任何第三方统计脚本 -->
<!-- 需要数据时直接分析服务器日志 -->

八、本站的选择

本站没有加任何统计脚本。理由:

  1. 要支持 file:// 离线打开,外部脚本会失效;
  2. 零依赖是本站的核心原则;
  3. 个人笔记站,看不看数据不影响我写;
  4. 加脚本 = 拖慢 + 多一个故障点 + 隐私问题。

真想知道哪些内容被看,就去看 Nginx 日志:

bash
# 最受欢迎的 10 篇
awk '{print $7}' /var/log/nginx/access.log | grep "^/post" | sort | uniq -c | sort -rn | head -10

# 每天 PV 趋势
awk '{print substr($4, 2, 11)}' /var/log/nginx/access.log | uniq -c

九、如果要用,我的建议顺序

bash
1. 站点在 Cloudflare 后面 → 开 CF Web Analytics(零 JS 模式)
2. 不在 CF → 自建 Umami(一台小服务器即可)
3. 不想运维 → 先看一段时间 Nginx 日志,够用就别加
4. 都不想 → 不加,把精力放在内容上

统计数据的价值在于指导你做什么。如果看了数据也不会改变行为,那它就是纯粹的成本。