apache日志需先提取客户端ip(注意代理场景下取x-forwarded-for等头字段),再通过geolite2或nali等ip库映射地理信息,实现按省份或国家统计用户来源。

Apache 日志本身不直接记录访问者所在省份或国家,但可以通过解析客户端 IP 地址,再结合 IP 归属地数据库(如 GeoLite2 或 nali),实现按地理区域统计用户来源分布。关键分两步:先提取 IP,再映射地理位置。
提取原始访问 IP
Apache 访问日志中,客户端真实 IP 通常在第一列($1),但需注意代理场景:
- 若未使用 CDN 或反向代理,直接取
$1即可 - 若启用了 Nginx/CDN,实际 IP 可能在
X-Forwarded-For或X-Real-IP头中,需确保 Apache 日志格式已配置记录该字段,例如:LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - 验证日志字段位置:用
head -1 /var/log/apache2/access.log查看实际结构,避免默认按空格切分出错
按中国省份统计(推荐用 ip_to_province 函数)
如果你使用的是支持 SQL 分析的日志平台(如阿里云 SLS、腾讯云CLS 或自建 ClickHouse+日志采集),可直接运行:
* | select ip_to_province(client_ip) as province, count(*) as "访问次数" group by province order by "访问次数" desc limit 1000
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
该函数会自动识别国内常见私有 IP(如 10.0.0.0/8)、内网地址并过滤,只对公网 IP 做地理映射,结果更干净。
按国家/地区统计(本地命令行方案)
在服务器本地分析,需配合 IP 库工具:
- 安装
mmdblookup(用于 GeoLite2 数据库):
下载GeoLite2-Country.mmdb到/usr/share/GeoIP/,每月手动更新一次 - 统计前 1000 个 IP 所属国家:
awk '{print $1}' /var/log/apache2/access.log | sort -u | while read ip; do mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip "$ip" country iso_code 2>/dev/null | tr -d '"\n'; echo " $ip"; done | awk '{print $1}' | sort | uniq -c | sort -nr | head -20 - 想看中文地区名?换用
nali:awk '{print $1}' /var/log/apache2/access.log | sort -u | nali | grep -v "保留地址\|私有地址" | cut -d' ' -f2- | sort | uniq -c | sort -nr | head -15
注意事项与常见问题
地理统计不是 100% 精确,以下情况会影响结果:
- IP 库滞后:新分配的 IP 可能未收录,显示为 “reserved” 或空,应主动过滤
- 代理与 NAT:企业出口、校园网、4G/5G 共享出口会导致大量用户显示同一省份甚至同一城市
- 隐私设置干扰:部分浏览器或 APP 内嵌页不发送 Referer,但 IP 地理定位不受影响;IP 定位本身不依赖 Referer
- 日志中含大量内网 IP(如 192.168.x.x、172.16–31.x.x、10.x.x.x):建议先用 awk 排除,避免污染统计结果










