利用GoAccess生成全方面网站访问分析报告
本文最后更新于 2024-05-24,
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。
本站只有Telegram群组为唯一交流群组, 点击加入
文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请
前言
最近,我希望对博客的访问情况进行全面统计,以便实时了解博客的动态,并检查是否存在可疑访问行为。为此,我选择了GoAccess这款网站统计工具。本文将根据我的个人需求,记录GoAccess的部署过程。服务器系统选择Ubuntu 22。
什么是GoAccess?
GoAccess 是一款设计用于快速终端日志分析的工具。它的核心理念是无需使用浏览器,便能快速分析和查看网站服务器统计信息,实时了解网站动态(非常适合通过 SSH 快速分析访问日志,或是喜欢在终端中工作的用户)。
虽然终端输出是默认模式,但 GoAccess 也能生成完整的、独立的实时 HTML 报告(非常适合分析、监控和数据可视化),以及 JSON 和 CSV 格式的报告。
主要特点包括:
- 快速实时更新,速度以毫秒/秒计,使用 C 语言编写
- 仅依赖 ncurses 库
- 支持几乎所有的 web 日志格式(如 Apache、Nginx、Amazon S3、Elastic Load Balancing、CloudFront、Caddy 等)
- 只需设置日志格式并对日志运行分析
- 提供美观的终端和 bootstrap 仪表盘(可以根据个人喜好定制颜色和样式)
- 经过 Valgrind 测试,确保稳定性和可靠性
- 通过 GoAccess,你可以高效地监控和分析网站的访问情况,获得有价值的实时统计数据。
我的需求
- 通过Nginx当天的访问记录生成当天的访问统计。
- 通过过往的Nginx记录生成全时段的访问统计。
- 因为解析会消耗一定性能,统计解析工作交由B服务器完成。
- 每天凌晨执行一次
大致流程梳理
- 博客服务器A定时将Nginx记录同步备份到统计服务器B。
- B服务器定时解析Nginx记录,并生成HTML报告。
同步Nginx记录
这里我选用的是【rsync】来同步AB服务器的数据。
什么是rsync?
rsync 是一个在 Unix-like 系统(如 Linux)中广泛使用的文件同步工具,它有以下几个主要特点:
- 增量复制:rsync 只会复制文件中改变的部分,而不是整个文件,这使得它在处理大文件或者大量文件时非常高效。
- 压缩和解压缩:在传输数据时,rsync 会自动压缩和解压缩数据。这可以减少网络传输的数据量。
- 保留文件属性:rsync 不仅可以复制文件的内容,还可以复制文件的权限、时间戳等属性。
- 支持本地和远程同步:rsync 可以在本地的两个目录之间同步文件,也可以在本地和远程服务器之间同步文件。
- 安全:当在远程服务器之间同步文件时,rsync 可以使用 ssh 来加密数据。
- 链接支持:rsync 可以识别并正确处理符号链接和硬链接。
- 排除文件:rsync 允许你指定某些文件或目录不进行同步,这可以通过使用 --exclude 选项来实现。
- 断点续传:如果同步过程中被中断,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
先写一个脚本:
#!/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