nginx日志可通过geoip解析ip获取地理位置生成地域热力图,或按url路径聚合生成资源热度图;需注意真实ip提取、精度限制及业务维度叠加分析。

Nginx 日志本身不直接记录地理坐标,但可以通过客户端 IP 推断大致地理位置,从而生成资源请求热力图(通常指按地域分布的访问密度图)。关键在于:IP → 地理位置映射 + 请求资源聚合 + 可视化呈现。
地域维度热力图(Geo Map)怎么实现
热力图的核心是把每个请求按来源地“打点”,再按区域聚合计数。Nginx 原生日志只含 $remote_addr(IP),需借助 GeoIP 库补充省份/国家信息。
- 使用
GeoLite2-City.mmdb(当前主流库)解析 IP,可获取国家、省份、城市、经纬度等字段 - 实际精度受限:多数免费版仅支持国家级别定位,部分商业库或更新数据可到城市级
- 注意:若日志中 IP 是代理后的真实客户端 IP(如经
X-Forwarded-For传递),需在 Nginx 中用$http_x_forwarded_for替代$remote_addr,并确保可信代理配置正确
示例查询(阿里云 SLS 日志服务):
* | select count(1) as pv, ip_to_province(remote_addr) as province group by province order by pv desc limit 50
该语句统计各省份请求量,结果可直出中国地图热力图。
资源维度热力图(URL/Path 热度)怎么理解
这不是地理热力图,而是“请求路径热度分布图”——常被误称为“资源热力图”。它反映哪些 URL 被高频访问,适合发现热门接口或静态资源。
- 提取
$request字段中的路径(如GET /api/user/info HTTP/1.1→/api/user/info) - 按路径分组计数,过滤掉探针、健康检查等干扰路径(如
/healthz,/ping) - 可叠加状态码、响应时间维度,识别“高访问 + 高延迟”的异常资源
命令行快速查看 Top 10:
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
如何让热力图真正有用
单纯画图没价值,要结合业务目标设计维度:
- 按时间切片:对比工作日 vs 周末的地域访问变化,辅助 CDN 节点调度
- 按状态码分层:把 4xx/5xx 请求单独标红,快速定位某地区服务异常
- 关联 Referer 或 User-Agent:判断某省流量是否来自特定渠道(如微信内嵌页),验证推广效果
- 排除爬虫 IP 段:避免被恶意扫描流量扭曲真实用户热力分布
工具链建议(轻量到生产)
- 小规模(日志
- 中等规模(K8s 环境):用 APO 或 Filebeat 采集日志 → Elasticsearch 存储 → Kibana 地图可视化(需开启
geo_point类型字段) - 生产级:接入日志服务(如阿里云 SLS、腾讯云 CLS),直接使用内置地理围栏与热力图组件,支持实时下钻
不复杂但容易忽略











