09 - 指标分析
09 - 指标分析
9.1 概述
GoAccess 提供的不仅仅是数字,而是可以驱动业务决策的洞察。本章将逐项解读每个核心指标的含义、分析方法和实际应用场景,帮助你从日志数据中提取最大价值。
┌─────────────────────────────────────────────────┐
│ GoAccess 指标体系 │
├─────────────────────────────────────────────────┤
│ │
│ 流量指标 用户指标 质量指标 │
│ ───────── ───────── ───────── │
│ · 请求量 (Hits) · 独立访客 (UV) · 状态码分布 │
│ · 带宽 (Bw) · IP 排行 · 404 页面 │
│ · 请求文件 · 地理位置 · 请求耗时 │
│ │
│ 来源指标 设备指标 │
│ ───────── ───────── │
│ · 来源站点 · 操作系统 │
│ · 来源 URL · 浏览器 │
│ · TLS 版本 │
└─────────────────────────────────────────────────┘
9.2 访问量指标(Hits)
9.2.1 指标定义
| 术语 | 英文 | 说明 |
|---|---|---|
| 总请求量 | Total Hits | 日志中所有请求的总和 |
| 有效请求 | Valid Requests | 成功解析的请求数 |
| 失败请求 | Failed Requests | 解析失败的请求数(格式不匹配等) |
| 排除请求 | Excluded Hits | 被过滤规则排除的请求数 |
9.2.2 分析方法
# 查看总体访问量
goaccess access.log --log-format=COMBINED
# 终端面板中关注:
# General Dashboard → Hits 字段
# 使用 JSON 导出精确数值
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.general | {total: .total_requests, valid: .valid_requests, failed: .failed_requests}'
9.2.3 业务场景
场景一:流量趋势分析
# 生成每日报告,观察趋势
for day in $(seq 1 31); do
DATE=$(printf "202605%02d" $day)
COUNT=$(grep "$(printf '%02d/May/2026' $day)" access.log | wc -l)
echo "${DATE}: ${COUNT} 次请求"
done
场景二:异常流量检测
# 对比今日与往日平均值
TODAY=$(grep "$(date +%d/%b/%Y)" access.log | wc -l)
AVG=$(cat /tmp/historical_avg.txt) # 历史平均值
THRESHOLD=$(echo "$AVG * 2" | bc)
if [ "$TODAY" -gt "$THRESHOLD" ]; then
echo "⚠️ 流量异常!今日: ${TODAY}, 历史均值: ${AVG}"
fi
9.2.4 注意事项
- Hits ≠ 访客:一个用户可能产生多个 Hits
- 爬虫影响:爬虫请求也计入 Hits,需要排除后分析真实用户
- 静态资源:JS/CSS/图片也会产生 Hits,通常需要排除分析业务请求
9.3 独立访客指标(Unique Visitors)
9.3.1 指标定义
GoAccess 使用 IP 地址 作为访客唯一标识。同一 IP 在分析时间范围内只计为一个独立访客。
| 术语 | 说明 |
|---|---|
| Unique Visitors (UV) | 不重复的 IP 数量 |
| Hits per Visitor | 平均每个访客的请求数 |
9.3.2 分析方法
# 终端面板查看访客排行
# 面板 1: Unique Visitors
# 显示: IP、请求数、访客占比
# 按访客数排序
goaccess access.log --log-format=COMBINED \
--sort-panel=VISITORS,BY_VISITORS
# 导出 Top 20 访客 IP
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.visitors.data[:20] | .[] | {ip: .data, hits: .hits.count, visitors: .visitors.count}'
9.3.3 局限性
| 问题 | 说明 | 改进方案 |
|---|---|---|
| NAT/代理 | 多个用户共享同一 IP | 使用 X-Forwarded-For |
| 动态 IP | 同一用户每次 IP 不同 | 使用 Cookie/Session ID |
| 爬虫 | 爬虫 IP 也算访客 | 排除已知爬虫 UA |
| IPv6 | 不同设备可能共享前缀 | 考虑使用 /64 前缀去重 |
9.3.4 业务场景
# 排除爬虫后的真实访客数
goaccess access.log --log-format=COMBINED \
--exclude='(bot|crawler|spider|slurp|Bytespider|GPTBot)' \
--exclude='\.(css|js|jpg|png|gif|ico|svg|woff2?)$'
9.4 带宽指标(Bandwidth)
9.4.1 指标定义
| 术语 | 说明 |
|---|---|
| 总带宽 | 所有响应体大小之和 |
| 平均请求大小 | 总带宽 / 总请求数 |
| 排除带宽 | 排除静态资源后的带宽 |
9.4.2 分析方法
# 终端面板查看带宽统计
# General Dashboard → Bandwidth 字段
# 按带宽排序请求文件
goaccess access.log --log-format=COMBINED \
--sort-panel=REQUESTS,BY_BANDWIDTH
# 查看带宽消耗最大的文件
# 面板 2 (Requested Files) → 按 Bandwidth 列排序
9.4.3 业务场景
场景一:识别带宽瓶颈
# 找出带宽消耗 Top 10 的请求
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.requests.data[:10] | .[] | "\(.data): \(.bandwidth.count) bytes (\(.hits.count) hits)"'
场景二:CDN 效果评估
# 分析静态资源的带宽占比
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '{
total_bw: .general.bandwidth,
static_bw: (.static_requests.data | map(.bandwidth.count) | add),
ratio: ((.static_requests.data | map(.bandwidth.count) | add) / .general.bandwidth * 100)
}'
9.4.4 带宽优化建议
| 场景 | 优化方案 |
|---|---|
| 静态资源占比高 | 启用 CDN、开启 Gzip/Brotli |
| 大文件下载 | 限制下载速度、使用分片下载 |
| API 响应过大 | 启用 API 压缩、分页返回 |
| 重复请求多 | 设置合理的 Cache-Control |
9.5 请求文件分析
9.5.1 分析维度
| 指标 | 说明 | 分析价值 |
|---|---|---|
| 请求量排序 | 最常被访问的 URL | 热门内容识别 |
| 带宽排序 | 消耗最多带宽的 URL | 带宽优化方向 |
| 访客排序 | 访问人数最多的 URL | 内容覆盖分析 |
| 平均大小 | 单次请求的平均大小 | 响应优化评估 |
9.5.2 分析方法
# 查看请求文件排行
# 面板 2: Requested Files
# 导出热门页面 Top 20
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.requests.data[:20][] | {url: .data, hits: .hits.count, percent: .hits.percent}'
# 按访客数排序
goaccess access.log --log-format=COMBINED \
--sort-panel=REQUESTS,BY_VISITORS
9.5.3 业务场景
场景一:内容运营分析
# 分析博客文章的访问量
grep '"/items/' access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REQUESTS,BY_HITS \
--ignore-panel=HOSTS \
--ignore-panel=GEO_LOCATION \
--ignore-panel=REFERRING_SITES \
-
场景二:API 使用分析
# 分析 API 端点的使用情况
grep '"/api/' access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REQUESTS,BY_HITS \
--ignore-panel=GEO_LOCATION \
--ignore-panel=REFERRING_SITES \
-
9.6 状态码分析
9.6.1 状态码分类
| 状态码范围 | 含义 | 说明 |
|---|---|---|
| 2xx | 成功 | 正常响应 |
| 3xx | 重定向 | URL 跳转 |
| 4xx | 客户端错误 | 请求有问题 |
| 5xx | 服务器错误 | 服务端异常 |
9.6.2 常见状态码
| 状态码 | 名称 | 可能原因 |
|---|---|---|
| 200 | OK | 正常请求 |
| 301 | Moved Permanently | 永久重定向 |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 缓存命中 |
| 400 | Bad Request | 请求格式错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 权限不足 |
| 404 | Not Found | 资源不存在 |
| 429 | Too Many Requests | 请求频率过高 |
| 500 | Internal Server Error | 服务端异常 |
| 502 | Bad Gateway | 上游服务异常 |
| 503 | Service Unavailable | 服务不可用 |
| 504 | Gateway Timeout | 上游超时 |
9.6.3 分析方法
# 终端面板查看状态码分布
# 面板 10: HTTP Status Codes
# 只分析错误请求
goaccess access.log --log-format=COMBINED \
--status-code=4xx --status-code=5xx
# 导出状态码分布
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.status_codes.data[] | "\(.data): \(.hits.count) (\(.hits.percent)%)"'
9.6.4 状态码健康度评估
#!/bin/bash
# status_health.sh — 状态码健康度评估
LOG_FILE="/var/log/nginx/access.log"
TOTAL=$(wc -l < "${LOG_FILE}")
S200=$(grep -c '" 200 ' "${LOG_FILE}")
S404=$(grep -c '" 404 ' "${LOG_FILE}")
S500=$(grep -c '" 500 ' "${LOG_FILE}")
S502=$(grep -c '" 502 ' "${LOG_FILE}")
PCT_200=$(echo "scale=2; ${S200} * 100 / ${TOTAL}" | bc)
PCT_404=$(echo "scale=2; ${S404} * 100 / ${TOTAL}" | bc)
PCT_5XX=$(echo "scale=2; (${S500} + ${S502}) * 100 / ${TOTAL}" | bc)
echo "===== 状态码健康度报告 ====="
echo "总请求: ${TOTAL}"
echo "200 OK: ${S200} (${PCT_200}%)"
echo "404: ${S404} (${PCT_404}%)"
echo "5xx: $((S500 + S502)) (${PCT_5XX}%)"
echo ""
# 健康评级
if (( $(echo "${PCT_5XX} > 1" | bc -l) )); then
echo "⚠️ 健康状态: 差 — 5xx 错误率 > 1%"
elif (( $(echo "${PCT_5XX} > 0.1" | bc -l) )); then
echo "🔶 健康状态: 注意 — 5xx 错误率 > 0.1%"
else
echo "✅ 健康状态: 良好"
fi
9.6.5 404 页面深度分析
# 分析 404 页面 — 发现死链和扫描行为
grep '" 404 ' /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REQUESTS,BY_HITS \
--ignore-panel=GEO_LOCATION \
--ignore-panel=REFERRING_SITES \
--ignore-panel=BROWSERS \
--ignore-panel=OS \
-
404 分析的业务价值:
| 模式 | 可能原因 | 行动建议 |
|---|---|---|
/old-page.html | 内容迁移未设置重定向 | 添加 301 重定向 |
/wp-admin | 扫描器探测 | 忽略或封禁 IP |
/api/v1/old-endpoint | API 版本变更 | 更新客户端/文档 |
/images/old-logo.png | 资源被删除但仍被引用 | 更新引用或恢复资源 |
9.7 来源页分析(Referrer)
9.7.1 指标说明
| 面板 | 说明 | 用途 |
|---|---|---|
| Referring Sites | 来源域名排行 | 识别流量来源渠道 |
| Referring URLs | 来源完整 URL | 精确定位引流页面 |
9.7.2 分析方法
# 查看来源站点排行
# 面板 8: Referring Sites
# 查看来源 URL 排行
# 面板 9: Referring URLs
# 只分析来自搜索引擎的流量
grep -iE '(google\.com|bing\.com|baidu\.com|sogou\.com)' \
access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REFERRING_SITES,BY_HITS \
-
9.7.3 业务场景
场景一:SEO 效果评估
# 分析搜索引擎来源
grep -iE '(google|bing|baidu|sogou|yandex)' access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REFERRING_URLS,BY_HITS \
--ignore-panel=HOSTS \
--ignore-panel=OS \
--ignore-panel=BROWSERS \
-
场景二:营销渠道分析
# 分析社交媒体来源
grep -iE '(facebook|twitter|weibo|wechat|zhihu|douyin)' \
access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REFERRING_SITES,BY_HITS \
-
9.8 地理位置分析
9.8.1 前置条件
需要配置 GeoIP 数据库(见 02 - 安装与配置 的 GeoIP 配置章节)。
9.8.2 分析方法
# 启用地理位置面板
goaccess access.log --log-format=COMBINED \
--geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb
# 终端面板 12: Geo Location
# 显示: 国家、城市、请求数、访客数
9.8.3 业务场景
场景一:国际化分析
# 导出国家分布
goaccess access.log --log-format=COMBINED \
--geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb \
-o - --no-global-config | \
jq '.geolocation.data[:20][] | "\(.data): \(.hits.count) hits, \(.visitors.count) visitors"'
场景二:区域合规分析
# 识别来自特定国家的流量(如 GDPR 合规需求)
goaccess access.log --log-format=COMBINED \
--geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb \
--sort-panel=GEO_LOCATION,BY_VISITORS
9.9 设备与浏览器分析
9.9.1 操作系统分布
# 面板 6: Operating Systems
goaccess access.log --log-format=COMBINED \
--sort-panel=OS,BY_VISITORS
9.9.2 浏览器分布
# 面板 7: Browsers
goaccess access.log --log-format=COMBINED \
--sort-panel=BROWSERS,BY_VISITORS
9.9.3 业务场景
场景一:浏览器兼容性评估
# 识别需要支持的浏览器版本
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
jq '.browsers.data[:10][] | "\(.data): \(.visitors.count) visitors (\(.visitors.percent)%)"
场景二:移动端占比分析
# 提取移动端 UA 分析
grep -iE '(mobile|android|iphone|ipad)' access.log | \
goaccess --log-format=COMBINED \
--sort-panel=BROWSERS,BY_VISITORS \
--ignore-panel=HOSTS \
--ignore-panel=GEO_LOCATION \
-
9.10 请求耗时分析
9.10.1 前置条件
日志中需要包含请求耗时字段(Nginx 的 $request_time):
log_format timed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
9.10.2 分析方法
# 使用包含耗时字段的格式
goaccess access.log \
--log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
--date-format=%d/%b/%Y \
--time-format=%H:%M:%S
# GoAccess 会自动添加请求耗时相关的面板
# - Avg. T.S. (平均耗时)
# - Cum. T.S. (累计耗时)
# - Max T.S. (最大耗时)
9.10.3 排序与分析
# 按平均耗时排序请求文件
goaccess access.log \
--log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
--date-format=%d/%b/%Y \
--time-format=%H:%M:%S \
--sort-panel=REQUESTS,BY_AVGTS
# 按最大耗时排序
goaccess access.log \
--log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
--date-format=%d/%b/%Y \
--time-format=%H:%M:%S \
--sort-panel=REQUESTS,BY_MAXTS
9.11 综合指标仪表盘
#!/bin/bash
# metrics_dashboard.sh — 生成综合指标仪表盘
LOG_FILE="/var/log/nginx/access.log"
REPORT="/var/www/html/dashboard.html"
# 使用持久化模式
DB_FILE="/tmp/goaccess_metrics.db"
goaccess "${LOG_FILE}" --log-format=COMBINED \
-o "${DB_FILE}" --persist 2>/dev/null
goaccess "${DB_FILE}" --restore \
-o "${REPORT}" \
--html-title="综合指标仪表盘" \
--html-prefs='{"theme":"bright","perPage":25}' \
--sort-panel=VISITORS,BY_VISITORS \
--sort-panel=REQUESTS,BY_HITS \
--sort-panel=HOSTS,BY_HITS
echo "仪表盘已生成: ${REPORT}"
9.12 指标分析最佳实践
| 实践 | 说明 |
|---|---|
| 排除噪音 | 过滤爬虫、静态资源、健康检查后再分析 |
| 对比分析 | 将当期数据与上期对比,观察趋势 |
| 多维度交叉 | 不要只看单一指标,结合访客+状态码+带宽综合分析 |
| 定期生成 | 使用 Cron/Timer 定期生成报告,保持监控连续性 |
| 导出存档 | 保留 JSON/CSV 历史数据,便于回溯分析 |
| 业务驱动 | 根据业务目标选择关注指标(SEO→来源页,性能→耗时,安全→状态码) |
9.13 小结
| 指标 | 面板 | 关键问题 |
|---|---|---|
| 请求量 | 通用仪表盘 | 流量是否正常?有无异常峰值? |
| 访客 | 面板 1 | 真实用户有多少?趋势如何? |
| 热门页面 | 面板 2 | 哪些内容最受欢迎? |
| 带宽 | 通用仪表盘 | 带宽消耗合理吗?需要优化吗? |
| 状态码 | 面板 10 | 错误率是多少?需要排查什么? |
| 404 | 面板 4 | 有死链吗?有扫描行为吗? |
| 来源页 | 面板 8/9 | 流量从哪来?SEO 效果如何? |
| 地理 | 面板 12 | 用户分布在哪里? |
| 设备 | 面板 6/7 | 移动端占比多少? |
下一章
下一章将介绍 GoAccess 的自动化集成方案,包括定时报告、告警机制、CI/CD 集成和邮件通知。