对于小型vps而言,传统的统计插件(比如 WP-Statistics)往往过于臃肿,而我们想要一个酷酷的分析页面可以供后台查询。
本文将分享如何利用 GoAccess 这款极简的日志分析工具,配合 Caddy 服务器 与 MaxMind 城市 IP 库,在 VPS 上从零搭建一套全自动、纯原生的中文可视化流量看板。
一、 安装 GoAccess
我最终选择GoAccess,他非常适合对于小型网站进行日志分析。下面是GoAccess的官方安装方法:
# 1. 导入 GoAccess 官方签名密钥
wget -O - [https://deb.goaccess.io/gnugpg.key](https://deb.goaccess.io/gnugpg.key) | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
# 2. 添加官方软件源
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg] [https://deb.goaccess.io/](https://deb.goaccess.io/) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
# 3. 更新索引并安装工具
sudo apt update
sudo apt install goaccess -y
二、 配置 MaxMind 动态 IP 城市库
GoAccess 识别访客地理位置依赖本地的 .mmdb 数据库。而MaxMind提供给我们ip城市分析,我们使用官方提供的 geoipupdate 工具来实现自动化维护。
sudo apt install geoipupdate
1. 完善配置文件
修改 /etc/GeoIP.conf,填入你在 MaxMind 官网申请的免费凭证,你应该在key里区添加新的。
AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-City ... 根据你的需要
2. 首次下载
sudo geoipupdate
注:系统默认会将数据库下载至 /var/lib/GeoIP/GeoLite2-City.mmdb。你也可以通过上面语句添加-v显示详细信息
三、 调整 Caddy 信任代理
如果网站套了 Cloudflare 等 CDN 高防,Caddy 默认在日志里记录的会是 CDN 节点的 IP,这会导致 GoAccess 的地理位置分析全部失效(全显示为洛杉矶或未知机房)。
1. 注入全局信任块
打开 /etc/caddy/Caddyfile,在文件最顶部(第一行)加入以下配置,强制 Caddy 识别 Cloudflare 的真实客体 IP:
{
servers {
trusted_proxies static 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22
}
}
2. 配置站点日志输出
在你的域名配置块内加入日志输出规则:
blog.yourdomain.com {
...
log {
output file /var/log/caddy/blog.log {
roll_size 10mb
roll_keep 10
}
}
}
保存后,运行 caddy reload 重载服务。
四、 权限隔离与首次手动渲染
为了确保安全,我们将最终生成的 HTML 报表存放在专门的隐藏目录中,并理顺权限,让 WordPress 的 PHP 进程有权读取。
# 创建存放最终报告的目录
sudo mkdir -p /var/www/secure-logs
sudo chown -R $USER:www-data /var/www/secure-logs
chmod 755 /var/www/secure-logs
# 手动生成首次中文报表
LANG=zh_CN.UTF-8 goaccess /var/log/caddy/blog.log \
-o /var/www/secure-logs/report.html \
--log-format=CADDY \
--geoip-database=/var/lib/GeoIP/GeoLite2-City.mmdb
五、 Cron 定时任务
为了让数据保持最新,同时避免高频刷新拖累性能,我们设置每 10 分钟增量刷新一次报表,且每月自动更新一次 IP 库。
执行 crontab -e,在最底部写入:
# 1. 每月 1 号凌晨 3 点,全自动更新一次 MaxMind 城市 IP 数据库
0 3 1 * * /usr/bin/geoipupdate
# 2. 每 10 分钟,自动注入中文环境,精简读取日志并刷新
*/10 * * * * export LANG=zh_CN.UTF-8; /usr/bin/goaccess /var/log/caddy/blog.log -o /var/www/secure-logs/report.html --log-format=CADDY --geoip-database=/var/lib/GeoIP/GeoLite2-City.mmdb --no-global-config
注:读者可以使用 --ignore-panel 参数主动砍掉了诸如 404 错误、静态资源请求、来源页面等平时不常看的板块,提升了阅读体验。
六、 WordPress 配置
由于报表存放在 /var/www/secure-logs/report.html,该路径并未暴露在公网上。我们可以在 WordPress 的当前主题目录下新建一个自定义页面模板(如 page-goaccess.php),利用 PHP 看门狗机制实现后端越权读取:
<?php
/* Template Name: GoAccess Analytics Dashboard */
// 只有管理员有权查看流量大屏
if (!current_user_can('manage_options')) {
wp_die('Unauthorized access.');
}
$report_path = '/var/www/secure-logs/report.html';
if (file_exists($report_path)) {
echo file_get_contents($report_path);
} else {
wp_die('Analytics report not generated yet.');
}
最后,在 WordPress 后台新建一个常规页面,页面属性中的“模板”选择 GoAccess Analytics Dashboard,发布即可。

七、WordPress 菜单
如果你想要在菜单里添加只有管理员能看到的指向页面的链接,你可以安装Nav Menu Roles插件,它可以设置具体的权限。