apache正向代理需通过自定义日志格式(含%h、%r、%>s、%b等字段)并结合goaccess或脚本解析,才能实现按客户端、域名、协议、带宽等维度的流量统计与可视化分析。

Apache 正向代理本身不生成流量统计报表,但可通过日志结构化 + 外部工具解析,实现按客户端、目标域名、协议类型、响应大小等维度的网络开销分析。核心是让每条代理请求“可计量、可分类、可聚合”。
启用带关键字段的自定义访问日志
默认日志无法区分 HTTP/HTTPS 代理行为,也不记录真实目标地址和传输字节数。需在 <virtualhost></virtualhost> 或主配置中定义专用日志格式:
-
%h:发起代理请求的客户端真实 IP(确保未被中间设备覆盖) -
%{Referer}i或%{Proxy-Client-IP}i:辅助识别原始来源(配合mod_remoteip更可靠) -
%r:完整请求行,如GET http://api.example.com/v1/data HTTP/1.1或CONNECT github.com:443 HTTP/1.1 -
%>s:HTTP 状态码,用于识别失败请求(如 403、502) -
%b:响应体字节数(不含响应头),直接反映下行带宽消耗 -
%D:请求处理耗时(微秒),用于性能瓶颈初筛
示例配置:
LogFormat "%t %h %{X-Forwarded-For}i \"%r\" %>s %b \"%{User-Agent}i\" %D" proxy-traffic
CustomLog logs/proxy-traffic.log proxy-traffic
区分 HTTP 与 HTTPS 流量便于分类统计
HTTPS 代理只暴露域名和端口(CONNECT example.com:443),无法获取路径或参数;HTTP 代理则完整记录 URL。可在日志中打标便于后续切分:
- 用
SetEnvIf标记请求类型:
SetEnvIf Request_Method "^CONNECT$" proto_https=1 SetEnvIf Request_URI "^http://" proto_http=1
- 扩展日志格式加入标识字段:
LogFormat "%t %h \"%r\" %>s %b %D %{proto_http}e %{proto_https}e" proxy-split
CustomLog logs/proxy-split.log proxy-split
这样导出 CSV 后,可用 Excel 或脚本快速统计 HTTP 总请求数、HTTPS 域名分布、各域名平均响应大小等。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
用 GoAccess 实时生成可视化报表(轻量推荐)
无需数据库或部署复杂栈,适合中小规模环境快速查看带宽热点和访问趋势:
- 安装 GoAccess(Ubuntu/Debian):
sudo apt install goaccess - 执行实时解析(自动识别
%b字段为带宽):
goaccess logs/proxy-traffic.log \ --log-format='%t %h %^ "%r" %s %b %^ %^ %T' \ --time-format='%d/%b/%Y:%H:%M:%S %^' \ --date-format='%d/%b/%Y' \ --real-time-html -o /var/www/html/traffic-report.html
生成页面含:Top URLs(按响应体积排序)、Top Hosts(按请求数/带宽双维度)、HTTP Status Codes(异常比例)、Traffic by Hour(时段带宽峰值)。
按天归档 + 脚本化汇总(自动化网络开销日报)
对长期运营场景,建议每日生成一份简明开销摘要。例如用 Bash + awk 统计当日总流量、Top5 消耗域名:
#!/bin/bash
LOG="logs/proxy-traffic.$(date -d 'yesterday' +%Y%m%d).log"
if [ -f "$LOG" ]; then
TOTAL_BYTES=$(awk '{sum += $6} END {print sum+0}' "$LOG")
echo "【$(date -d 'yesterday' +%Y-%m-%d) 流量日报】"
echo "总下行字节数:$(numfmt --to=iec-i --suffix=B $TOTAL_BYTES)"
echo "Top5 域名(按响应体积):"
awk '$6>0 && match($4, /https?:\/\/([^\/]+)/, arr) {dom[arr[1]] += $6} END {for (d in dom) print dom[d], d | "sort -nr | head -5"}' "$LOG" | \
awk '{printf "%s\t%s\n", $1, $2}'
fi
将该脚本加入 cron,每天早 8 点运行并邮件发送,即可持续掌握网络资源占用情况。










