服务器部署网站流量统计服务

1. 前言
一个小的站点毕竟也没有多少的访问量,但是对于团队或者公司就不一样了,他们需要做数据分析,来研究出访问者的喜好,有利于提高业务的洞察力。现在我们是个人的小破站点,流量是很少的,但是我们也非常感兴趣访问者的喜好,比如搜索了什么关键词,是在哪里引流过来的,使用什么客户端访问的,等等访客者的喜好都可以进行统计。
我们即将部署的是umami,它是一个轻量的统计服务,当然相比与GA(Google Analytics)来说是相对简单很多,但是胜在是自建的服务,不需要托管,也不需要付费。自建是完全自定义且数据私有的方法,简单功能也能满足我们日常的统计需求,为我们的小破站点增加一点可以监测的功能,这还是很有趣的。
2. 选择
流量统计服务的选择有:
- 入口日志统计型
- JS统计型
2.1 入口日志统计
选择:GoAccess
特点:满足统计有没有请求,请求来自哪里,什么时候来的;可静态资源,无入侵性(head), 无需db,占用资源极低,可统计多站 / API / 图床的多站点
路径:浏览器 → npm(Nginx) → access.log → GoAccess
2.2 JS 统计型
选择:
- Matomo(重,可以完整替代 GA,表写入次数非常高)
- Umami (轻量,表写入次数非常低)
- Plausible(部分收费,不考虑)
特点: 可统计哪个页面被看了,来源是什么,有侵入性(head),要db,占用资源为中;
路径:浏览器 → npm → 博客 → 页面 HTML → JS被执行 → 上报统计
2.3 选择什么
其中Matomo是最重的,它可以分析用户行为,访问路径,内容转化,但是我们不需要这么复杂的功能,毕竟服务器内存只有2G。
Umami 对于我们来说就刚刚好,它可以满足统计访问量 / 页面等常用功能。
路径:浏览器 → 博客页面(WordPress / Halo)→ JS(script umami.js) → Umami Server → PostgreSQL
3. 部署
3.1 如何做
对于wordpress:修改主题文件的header.php, 在header注入JS
对于Halo: 在全局head注入的设置中,注入JS
3.2 docker-compose
参考github官方文档,编写compose:

version: '3.8'
services:
db:
image: postgres:15-alpine
container_name: umami-postgres
environment:
POSTGRES_DB: umami_db
POSTGRES_USER: umami_user
POSTGRES_PASSWORD: umami_pass
volumes:
- /root/data/docker_data/umami/postgres-data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
umami:
image: ghcr.io/umami-software/umami:latest #使用github镜像
container_name: umami
# ports: #无需映射端口,使用内部网络
# - "53000:3000"
environment:
DATABASE_URL: postgresql://umami_user:umami_pass@db:5432/umami_db
APP_SECRET: b07b2912758aa928da40d9ffb289f18b0cfdae3abff7567e999005b62d6fdeb8 #openssl rand -hex 32
depends_on:
# - db
db:
condition: service_healthy #等待可用
init: true #启动 PID 1 的 tini init 进程(可选)
restart: unless-stopped
networks:
- default #默认网络
- my_npm_prj_npm_network #加入npm网络
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"] #容器内部健康检查,推荐加入
interval: 5s
timeout: 5s
retries: 5
networks:
my_npm_prj_npm_network:
external: true # 声明为外部网络
PS:
直接用 [服务名services],可以不需要容器名;
networks: - default # 显式加入默认网络(和postgres同网,default 是保留字) - my_npm_prj_npm_network # 加入npm网络
3.3 执行部署
检查端口占用:

#cd到umami项目,开始部署
docker-compose up -d
登录数据库检查:
docker exec -it umami-postgres bash
#su postgres #可选,切换用户
psql -U umami_user -d umami_db #以 umami_user 用户身份登录到 umami_db 数据库
dt #查看所有表
q #退出交互终端

检查网络:

4. 反代+登录
反代设置:

登录,使用默认账号密码:


5. 设置统计代码
添加网站:

获取JS统计代码脚本:

插入JS脚本:
位置:插入在 全局head标签之间,插入</head>之前
目的:先加载页面元信息与CSS, 最后再执行JS统计代码


6. 成果展示
成果展示:

7. 最后
目前我们完成了流量统计服务,可以使用自定义域名进行访问,虽然功能不是很强大,但是胜在能用还省内存,一个小破站点该有的还是要有的,麻雀虽小五脏俱全。
元信息:
我还是喜欢每一篇文章都有#一级标题作为文章的名称,虽然有元信息定义了文章的标题,但是作为有Schema思维的工程师而言,这是很重要的,并不是多余的。同样在元信息定义文章的时间也很有必要,起码知道文章是什么时候写的,在日后如果有新的博客平台需求(比如Halo平台展示)的时候,可以手动修改适配元信息,在github博客文章仓库新开一个分支,元信息可以手动修改编辑,再提交到新的分支。Schema思维要求还是添加时间与标题的元信息好一点。



文章评论