导航

萌即是正义!时不时分享一些ACG活动记录与有趣代码的小站!

侧边栏
最新评论
广树
2024-10-18 07:41
@DavidYR:但是露营对我来说门槛太搞了
DavidYR
2024-10-18 01:28
摇曳露营太适合冬天在宿舍边和舍友打火锅边看了🥰
广树
2024-10-17 15:41
@Intotw:这不是穷嘛,就把视频进行了大压缩
Intotw
2024-10-17 15:36
为什么大佬你的照片和视频这两者的画质可以相差如何之多
广树
2024-10-17 14:48
@石樱灯笼:我下次留意下找找看
正在攻略

e54e3ae78936587d51e4b180673cb495.png

logo_kai.jpg


PSN奖杯卡

PSN奖杯卡

赞助商广告

利用GoAccess生成全方面网站访问分析报告

作者:广树时间:2024-05-16 11:16:29分类:其他

最近,我希望对博客的访问情况进行全面统计,以便实时了解博客的动态,并检查是否存在可疑访问行为。为此,我选择了GoAccess这款网站统计工具。本文将根据我的个人需求,记录GoAccess的部署过程。服务器系统选择Ubuntu 22。


什么是GoAccess?

GoAccess 是一款设计用于快速终端日志分析的工具。它的核心理念是无需使用浏览器,便能快速分析和查看网站服务器统计信息,实时了解网站动态(非常适合通过 SSH 快速分析访问日志,或是喜欢在终端中工作的用户)。

虽然终端输出是默认模式,但 GoAccess 也能生成完整的、独立的实时 HTML 报告(非常适合分析、监控和数据可视化),以及 JSON 和 CSV 格式的报告。


主要特点包括:

  1. 快速实时更新,速度以毫秒/秒计,使用 C 语言编写
  2. 仅依赖 ncurses 库
  3. 支持几乎所有的 web 日志格式(如 Apache、Nginx、Amazon S3、Elastic Load Balancing、CloudFront、Caddy 等)
  4. 只需设置日志格式并对日志运行分析
  5. 提供美观的终端和 bootstrap 仪表盘(可以根据个人喜好定制颜色和样式)
  6. 经过 Valgrind 测试,确保稳定性和可靠性
  7. 通过 GoAccess,你可以高效地监控和分析网站的访问情况,获得有价值的实时统计数据。


我的需求

  1. 通过Nginx当天的访问记录生成当天的访问统计。
  2. 通过过往的Nginx记录生成全时段的访问统计。
  3. 因为解析会消耗一定性能,统计解析工作交由B服务器完成。
  4. 每天凌晨执行一次


大致流程梳理

  1. 博客服务器A定时将Nginx记录同步备份到统计服务器B。
  2. B服务器定时解析Nginx记录,并生成HTML报告。


同步Nginx记录

这里我选用的是【rsync】来同步AB服务器的数据。


什么是rsync?

rsync 是一个在 Unix-like 系统(如 Linux)中广泛使用的文件同步工具,它有以下几个主要特点:

  1. 增量复制:rsync 只会复制文件中改变的部分,而不是整个文件,这使得它在处理大文件或者大量文件时非常高效。
  2. 压缩和解压缩:在传输数据时,rsync 会自动压缩和解压缩数据。这可以减少网络传输的数据量。
  3. 保留文件属性:rsync 不仅可以复制文件的内容,还可以复制文件的权限、时间戳等属性。
  4. 支持本地和远程同步:rsync 可以在本地的两个目录之间同步文件,也可以在本地和远程服务器之间同步文件。
  5. 安全:当在远程服务器之间同步文件时,rsync 可以使用 ssh 来加密数据。
  6. 链接支持:rsync 可以识别并正确处理符号链接和硬链接。
  7. 排除文件:rsync 允许你指定某些文件或目录不进行同步,这可以通过使用 --exclude 选项来实现。
  8. 断点续传:如果同步过程中被中断,rsync 可以从中断处继续同步,而不是重新开始。


安装

在终端中输入以下命令来更新你的包列表:

sudo apt update

然后,输入以下命令来安装 rsync:

sudo apt install rsync

安装完成后,你可以通过输入以下命令来验证 rsync 是否已经成功安装:

rsync --version

如果 rsync 已经成功安装,这个命令将会显示 rsync 的版本信息。


AB服务器之间的SSH通信

在B服务器设置一个用户:

sudo adduser backupuser

按照要求填写密码

A服务器设置SSH密钥对:

ssh-keygen

因为是自动化需要,这个密钥对不设置密码。

将 A 服务器的公钥复制到 B 服务器:

ssh-copy-id backupuser@B服务器域名或者IP


同步文件

假设备份的日志文件在log文件夹,要备份到B服务器的/path/rsync目录,则需要在/path/rsync目录下创建一个log文件夹并设置权限:

sudo chown -R backupuser /path/rsync/log

同步脚本

写一个同步用的定时脚本

#!/bin/bash
# 启动 ssh-agent
eval "$(ssh-agent -s)"

# 添加你的私钥到 ssh-agent
ssh-add /root/.ssh/id_rsa

rsync -avz /path/log backupuser@B服务器域名或者IP:/path/rsync

定时任务

0 1 * * * /path/to/your/script.sh

例如,如果你想要每天凌晨 1 点运行你的脚本

请注意,你的 sh 脚本需要有执行权限。你可以使用 chmod 命令来给它添加执行权限:

chmod +x /path/to/your/script.sh


在B服务器安装配置GoAccess

安装GoAccess

首先,你需要安装一些必要的构建工具和依赖项。在终端中输入以下命令:

sudo apt update
sudo apt install build-essential autoconf gettext autopoint libncursesw5-dev libmaxminddb-dev

下载 GoAccess 的源代码:

wget https://tar.goaccess.io/goaccess-1.9.2.tar.gz

具体版本可以通过官网获取: https://goaccess.io/download

解压下载的文件:

tar -xzvf goaccess-1.9.2.tar.gz

进入解压后的目录:

cd goaccess-1.9.2/

配置 GoAccess。这里我们启用 UTF-8 支持和 GeoIP 支持:

./configure --enable-utf8 --enable-geoip=mmdb

编译 GoAccess:

make

安装 GoAccess:

sudo make install

完成以上步骤后,GoAccess 就应该已经成功安装在你的 Ubuntu 22.04 系统上了。你可以通过输入 goaccess --version 来验证安装是否成功。


安装语言包

如果想要生成的HTML为中文,那么需要安装系统中文语言包

sudo apt-get install language-pack-zh-hans


安装地域信息

进入GoAccess安装目录:

cd /usr/local/etc/goaccess

安装 gunzip,这是一个用于解压 .gz 文件的工具。在终端中输入以下命令:

sudo apt install gzip

然后,你可以从 DB-IP 下载免费的 GeoIP2 数据库。在终端中输入以下命令:

wget https://download.db-ip.com/free/dbip-city-lite-2024-05.mmdb.gz

下载完成后,你可以使用 gunzip 来解压下载的文件:

gunzip dbip-city-lite-2024-05.mmdb.gz

然后编辑【/usr/local/etc/goaccess/goaccess.conf】文件

找到【geoip-database】,去掉注释,并指定mmdb文件路径:

geoip-database /usr/local/etc/goaccess/dbip-city-lite.mmdb


配置定时任务

生成当天访问记录HTML

先写一个脚本:

#!/bin/bash

# 获取当前日期和时间
datetime=$(date +'%Y%m%d%H%M%S')

# 设置日志文件和报告文件的路径
log_file="/path/rsync/log/blog.log"
report_file="/path/rsync/report/blogReport${datetime}.html"

# 设置语言为中文
# sudo apt-get install language-pack-zh-hans
export LANG=zh_CN.UTF-8

# 使用GoAccess分析日志文件并生成报告
goaccess ${log_file} --log-format=COMBINED -a -o ${report_file}

添加 cron 任务:

0 2 * * * /path/to/your/script.sh


生成全部时间段的HTML

因为我每天会对日志进行分割压缩,所以处理起来稍微复杂一些。

另外为了防止重复分析,将会记录上次解析的时间点,在下一次运行时只解析上次解析时间点之后的日志。

以下是脚本:

#!/bin/bash

# 设置日志文件和报告文件的路径
log_dir="/path/rsync/log/"
report_file="/path/rsync/report/blogReportAll.html"
timestamp_file="/path/rsync/report/last_processed_timestamp"

# 设置语言为中文
export LANG=zh_CN.UTF-8

# 获取上次处理日志文件的时间
if [ -f ${timestamp_file} ]; then
    last_processed=$(cat ${timestamp_file})
else
    last_processed=0
fi

# 获取当前的时间戳
current_timestamp=$(date +%s)

# 创建一个数组来缓存符合规则的文件
files_to_process=()

# 找出所有符合规则的文件并添加到数组中
for file in ${log_dir}wikimoeBlog.log_*.gz; do
    file_timestamp=$(stat -c %Y ${file})
    if [ ${file_timestamp} -gt ${last_processed} ]; then
        files_to_process+=(${file})
    fi
done

# 打印出所有要处理的文件
echo "Files to process: ${files_to_process[@]}"

# 遍历数组,处理每个文件
for file in ${files_to_process[@]}; do
    echo "Processing file: ${file}"
    zcat ${file} | goaccess --log-format=COMBINED -a -o ${report_file} --persist --restore -
done

# 记录当前的时间戳
echo ${current_timestamp} > ${timestamp_file}

添加 cron 任务:

0 3 * * * /path/to/your/script.sh


最终生成的HTML预览

image-ccornfho.png

怎么说呢,不统计不知道,一统计发现小破站近半的访问来自各种爬虫😅。