自建 Busuanzi:高性能网站访问统计服务

前言

不蒜子(Busuanzi)一直是我最常用的静态网站访问统计工具:无需注册、零配置,只需嵌入一段 <script>,即可显示页面访问量(PV)和访客数(UV),用起来非常方便。

不过,随着网站访问量的增长,我越来越频繁地遇到两个问题:

  • 加载延迟大:统计数据经常延迟 2~5 秒才出现,有时甚至完全加载失败;
  • 服务不稳定:Busuanzi 后端依赖第三方服务(如早期的 LeanCloud),维护成本高,也偶尔出现服务宕机,导致数据无法加载。

于是我决定动手:自建一个 Busuanzi 后端,接口完全兼容原版,但性能更高、数据更稳,还能自由扩展逻辑。


我的目标

  • 接口无缝替换:前端无需修改逻辑,只需更换请求地址;
  • 高性能响应:支持高并发、Redis 缓存加速;
  • 数据持久可靠:实时记录 PV/UV,定期批量写入 PostgreSQL;
  • 兼容 JSONP:保持 <script src=...> 引入方式;
  • 准确 UV 去重:基于 Cookie 与 Redis 实现按天去重;

技术方案

我使用 Go 语言编写后端服务,结合 Redis 与 PostgreSQL,打造一个轻量、稳定、可扩展的访问统计系统:

模块 技术实现
Web 框架 Gin
缓存机制 Redis
数据存储 PostgreSQL
UV 去重机制 Cookie + Redis Set
防击穿方案 singleflight
写入优化 异步批量入库
数据返回格式 JSONP callback 支持

如何使用

前端代码无需改动,只需替换默认接口地址为自建服务地址即可:

官方默认引入方式

1
<script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

替换为自建服务

1
<script src="https://cdn.osyb.cn/static/busuanzi/2.3/busuanzi.pure.mini.js"></script>

如果你是手动拼接接口调用的方式:

将以下内容:

1
busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback

替换为:

1
api.osyb.cn/busuanzi?jsonpCallback=BusuanziCallback

在安知鱼主题中如何使用?

进入主题配置文件(_config.yml),找到末尾的 CDN 设置部分,改为:

1
2
3
CDN: 
option:
busuanzi: https://cdn.osyb.cn/static/busuanzi/2.3/busuanzi.pure.mini.js

保存配置并重新部署即可生效。

主题配置截图


项目地址


总结

不蒜子确实好用,但原服务的延迟和不稳定问题逐渐成为瓶颈。通过自建兼容接口,不仅可以解决加载慢、服务不稳的问题,还能做到更强的扩展性和数据可控性。如果你也在用不蒜子,不妨尝试换用我这个优化版本,体验更快、更稳的访问统计服务。


⚠️ 免责声明:本文仅供个人学习与技术研究使用。