前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自部署busuanzi访问量统计服务

自部署busuanzi访问量统计服务

作者头像
柳神
发布2024-05-30 21:14:55
1900
发布2024-05-30 21:14:55
举报
文章被收录于专栏:清羽飞扬

碎碎念

最近在部署访客系统的同时,发现busuanzi也经常性的加载不出来,并且也时不时的被拦截插件阻挡,导致访客数据一直转圈,严重拖慢网站加载速度,没有办法,我只能放弃之前的访问数据,我曾尝试使用木木的方法,将Umami前台展示,也成功过,但是如果想完全像busuanzi一样,实现整页计数,文章计数等等,改动太大,考虑到后续升级主题版本,我最终放弃,还是使用busuanzi,并且使用自部署的方式,管理好数据,尽量让其不再丢失。

官方服务经常性无法加载出来
官方服务经常性无法加载出来

简介

介绍

Busuanzi是一个轻量级的网站访问统计工具,旨在为网站管理员提供简单而有效的访问统计信息。它的主要功能包括:

  1. 页面浏览量统计: Busuanzi可以跟踪每个页面的浏览量,帮助网站管理员了解哪些页面受到了最多的访问。
  2. 访客数量统计: 它可以记录访问网站的独立访客数量,这有助于评估网站的受欢迎程度和用户群体规模。
  3. 实时数据更新: Busuanzi能够实时更新统计数据,让网站管理员能够及时了解网站的访问情况。
  4. 简单的集成: 它以JavaScript代码的形式提供,可以轻松地嵌入到网站的页面中,不需要复杂的设置或配置。
  5. 自定义选项: Busuanzi还提供了一些可定制的选项,例如是否显示访问量、访客数量等,以及显示格式等。

官方服务

官方介绍:“不蒜子”与百度统计谷歌分析等有区别:“不蒜子”可直接将访问次数显示在您在网页上(也可不显示);对于已经上线一段时间的网站,“不蒜子”允许您初始化首次数据。

首先感谢原作者不如,让我用上了如此快捷的前台访客计数展示,但是可能由于使用的人日益增多的原因,导致官方服务愈发缓慢,甚至有时候无法访问,拖慢网页加载速度,并且对于我这种有点强迫症的人来说更是难以忍受,于是我自己部署了busuanzi,将之前所有的官方数据留存到这里,以作纪念。

原本的busuanzi数据
原本的busuanzi数据

自部署服务

该项目使用Golang编程语言和Redis数据库来实现类似于busuanzi的功能。它通过统计不同IP地址来计算访客数量(UV),并通过Referer字段来区分页面浏览量(PV)。所有收集的信息都会经过MD5加密后存储在本地的dump.rdb文件中,以确保信息安全。这样就可以跟踪网站的访问量和访问者数量,同时保护数据的隐私安全,不过该项目不支持导入数据,下面我将介绍如何部署busuanzi及其部署后的注意事项。

部署

该项目给了三种部署方式:源码编译运行,使用docker运行和二进制文件运行,安装起来非常的简单!本次教程介绍最简单的第二种方式,docker运行。

前置步骤

创建网站,如busuanzi.example.com,该过程过于简单,略过。

宝塔面板创建网站
宝塔面板创建网站

创建模板

在网站目录下创建docker-compose.yaml模板文件:

代码语言:javascript
复制
version: "3"
services:
  redis:
    image: "redis:alpine"
    volumes:
      - ./data/redis:/data
  
  bsz:
    image: "xcsoft/busuanzi:latest"
    ports:
      - "8080:8080"
    volumes:
       - ./data/bsz:/app/expose
    links:
      - redis
    depends_on:
      - redis
    environment:
      LOG_ENABLE: true
      API_SERVER: http:\/\/127.0.0.1:8080\/api

主要修改的有端口号和最后一行的内容,最后一行不影响启动但是会自动生成js文件,注意,如果有需要,将http改为https,防止因为配置了SSL而拒绝连接。

下面就可以拉取docker并运行啦!执行以下命令:

代码语言:javascript
复制
docker-compose -up d

如果不出意外,docker应该已经正常运行了。可以使用:curl 127.0.0.1:8080测试是否正常运行,如果获取到以下内容即为成功。

测试是否正常运行
测试是否正常运行

然后配置反向代理后即可通过域名正常访问页面。

部署完成后,我们可以在宝塔的docker管理器中看到,其所占的内存是非常小的,个人服务器完全可以满足需要

内存占用情况
内存占用情况

禁止跨域

如果你不想让其他人使用,可以配置禁止跨域选项,打开网站目录下的文件./data/bsz/config.yaml,如下:

代码语言:javascript
复制
Web:
  Address: 0.0.0.0:8080 # 监听地址
  Access-Control-Allow-Origin: "https://blog.qyliu.top" # 跨域访问
  Debug: true # 是否开启debug模式
  Log: true # 是否开启日志
Redis:
  Address: redis:6379 # redis地址
  Password:
  Database: 0
  TLS: false      # 是否使用TLS连接redis
  Prefix: bsz     # redis前缀
  MaxIdle: 25     # 最大空闲连接数
  MaxActive: 100  # 最大连接数
  MinIdle: 25     # 最小空闲连接数
  MaxRetries: 3   # 最大重试次数
Bsz:
  JwtSecret: "bsz" # JWT签名密钥 // 请设置为任意长度的随机值

仅修改第三行跨域访问内容,其他内容请不要动,修改后,删除原docker重新运行docker模板,即可防止跨域访问,如果有其他网站试图使用,将会得到如下报错:

跨域访问的报错
跨域访问的报错

修改主页

如果你已经正确设置反向代理,你应该可以访问你的域名并查看到以下内容:

busuanzi默认主页面
busuanzi默认主页面

你可能会发现你的页面中api的地址不正确,下面我们进行修改,访问./data/bsz/dist/index.html,其中就是正常的HTML单页了,你可以按照你的要求自行修改内容,如添加评论区,设置背景等等,也可以参考本站进行美化,本站busuanzi地址如下:

这样,你的busuanzi服务就可以说是已经部署成功!

迁移

由于服务器的时限性,可能需要迁移服务器上的数据,于是我询问了开发者,最终开发者给出了两种方式;

直接迁移

直接迁移适用于rdb文件未超过三十天,因为超过三十天后,rdb文件中的数据将会被认为无效。

  1. 运行docker exec -it bsz-test-redis-1 redis-cli SAVE ,将redis写入dump.rdb
  2. 保存./data/redis/dump.rdb
  3. 在新服务器上 重新通过docker-compose up -d 启动服务后 停止服务
  4. 复制 dump.rdb 到新服务器的 ./data/redis 下 替换dump.rdb
  5. 重新使用 docker compose up -d 启动服务器

间接迁移

如果遇到rdb文件键key过期导致直接迁移无效的状况,我们可以尝试使用下面的方式进行迁移,该方法由张洪大佬提出,原地址在文章末尾处。

下载工具:点击下载,这里提供的是Linux的版本,也推荐在服务器上进行,实测windows会出现很多问题。

将下载后的文件放到rdb文件同目录下,并改名为rdb(主要是为了方便使用)

在目录下运行:rdb -c json -o dump.json dump.rdb命令

获取到json文件,放入到新服务器rdb文件所在目录下,在目录下再创建json2rdb.py文件,写入以下代码:

代码语言:javascript
复制
import json

# 读取JSON文件
with open('dump.json', 'r') as f:
    data = json.load(f)

redis_commands = []

# 根据不同的类型生成对应的Redis命令
for item in data:
    # 删除原有的键
    command_delete = f"DEL {item['key']}"
    redis_commands.append(command_delete)
    
    if item['type'] == 'string':
        # 设置字符串值
        command_add = f"SET {item['key']} {item['value']}"
        redis_commands.append(command_add)

    elif item['type'] == 'list':
        # 重新设置列表
        for val in item['values']:
            command_add = f"RPUSH {item['key']} {val}"
            redis_commands.append(command_add)

    elif item['type'] == 'set':
        # 重新设置集合
        command_add = f"SADD {item['key']} " + " ".join(item['members'])
        redis_commands.append(command_add)

    elif item['type'] == 'hash':
        # 重新设置哈希
        for k, v in item['hash'].items():
            command_add = f"HSET {item['key']} {k} {v}"
            redis_commands.append(command_add)

    elif item['type'] == 'zset':
        # 重新设置有序集合
        for entry in item['entries']:
            command_add = f"ZADD {item['key']} {entry['score']} {entry['member']}"
            redis_commands.append(command_add)

    elif item['type'] == 'stream':
        # 重新设置流
        for entry in item['entries']:
            for msg in entry['msgs']:
                fields = " ".join([f"{k} {v}" for k, v in msg['fields'].items()])
                command_add = f"XADD {item['key']} {msg['id']} {fields}"
                redis_commands.append(command_add)

# 将Redis命令写入文件
with open('redis_commands.txt', 'w') as f:
    f.write("\n".join(redis_commands))

运行:python3 import.py命令生成txt数据文件

运行命令:docker cp redis_commands.txt <容器名>:/tmp/,将文件放到docker内部,等待后续写入到redis,其中容器名称可以使用docker ps查看

分别执行:docker exec -it <容器名> /bin/shchmod 644 /tmp/redis_commands.txtexit,授予文件权限

执行导入docker exec -it <容器名> /bin/sh -c "/usr/local/bin/redis-cli < /tmp/redis_commands.txt",这样,应该就可以成功导入了,不过这个方法我并没有尝试过,如果有问题可以到原文章下进行提问。

问题记录

CROS跨域

代码语言:javascript
复制
Access to XMLHttpRequest at 'https://busuanzi.qyliu.top/api' from origin 'https://www.qingyang.eu.org' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'https://blog.qyliu.top' that is not equal to the supplied origin.

请检查配置文件中:Access-Control-Allow-Origin是否设置正确

HTTP配置问题

代码语言:javascript
复制
js:1 Mixed Content: The page at 'https://blog.qyliu.top/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://busuanzi.qyliu.top/api'. This request has been blocked; the content must be served over HTTPS.

该问题主要由创建docker-compose时未正确配置api地址导致,打开文件./data/bsz/dist/busuanzi.js,修改其中:http://../apihttps://../api,再次检查即可。

更多问题尚待检测或反馈中

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 碎碎念
  • 简介
    • 介绍
      • 官方服务
        • 自部署服务
        • 部署
          • 前置步骤
            • 创建模板
              • 禁止跨域
                • 修改主页
                • 迁移
                  • 直接迁移
                    • 间接迁移
                    • 问题记录
                      • CROS跨域
                        • HTTP配置问题
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档