apache不直接解析ip地理位置,需先通过%{x-real-ip}i等准确记录真实客户端ip,再借助geoip模块或外部工具做地理映射;customlog必须与logformat配对使用,且应过滤健康检查与内网请求以保障地理统计准确性。

Apache本身不直接获取或解析IP地理位置,CustomLog只能记录请求头中已有的IP字段。要体现“地理位置”,需分两步:先确保日志中记录的是真实客户端IP(而非代理或负载均衡IP),再借助外部工具(如GeoIP模块或日志分析系统)做后续地理映射。核心配置只负责准确捕获IP,这是所有地理分析的前提。
确认并记录真实客户端IP
默认%h记录的是直连IP,若前端有Nginx、HAProxy、硬件LB或CDN,必须改用请求头中的可信字段:
- 优先使用%{X-Real-IP}i:适用于Nginx等明确设置
proxy_set_header X-Real-IP $remote_addr的场景,通常最可靠 - 备选%{X-Forwarded-For}i:格式为
X-Forwarded-For: 203.122.45.67, 192.168.10.5,真实IP在最左,但需注意多层代理时可能被伪造,建议配合SetEnvIf限制可信代理段 - NAT型负载均衡(如NetScaler)可能用自定义头,例如%{source-ip}i,需与设备侧配置一致
定义专用日志格式并启用CustomLog
在httpd.conf或虚拟主机配置中添加:
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" realip_combined
CustomLog "logs/access_real.log" realip_combined
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
注意:CustomLog必须与LogFormat配对使用;若同时启用多个日志格式,确保CustomLog引用的是你刚定义的名称(如realip_combined)。
避免干扰项:过滤健康检查与内网请求
负载均衡器的周期性探测会污染日志,影响地理统计准确性:
- 用
SetEnvIfRequest_URI标记健康检查路径:
SetEnvIf Request_URI "^/health|^/ping" dontlog - 在
CustomLog中排除:
CustomLog "logs/access_real.log" realip_combined env=!dontlog - 如需过滤内网IP(如10.0.0.0/8、172.16.0.0/12),可用
SetEnvIf Remote_Addr配合正则,再用env=!internal控制输出
后续地理信息补充说明
Apache原生不支持IP转国家/城市。常见做法是:
- 启用
mod_geoip2(推荐)或旧版mod_geoip,在日志格式中直接插入%{GEOIP_COUNTRY_CODE}e等变量 - 保持日志纯IP,用ELK、GoAccess、或Python脚本在分析阶段调用MaxMind GeoLite2数据库批量解析
- 云WAF或CDN(如Cloudflare)可能提供
CF-IPCountry等头,可直接记录:%{CF-IPCountry}i










