要用kibana展示nginx访客地理位置分布,需三步:确保日志记录真实ip(用$http_x_forwarded_for并配置set_real_ip_from)、用ingest pipeline调用geolite2解析ip为geoip.location、在kibana maps中基于该geo_point字段创建坐标地图。

要用 Kibana 展示 Nginx 访客的地理位置分布,核心是把原始日志中的 IP 地址解析为经纬度,并在地图上可视化。这需要三步:Nginx 日志增强(记录真实 IP)、Logstash 或 Ingest Pipeline 做 GeoIP 解析、Kibana 中配置坐标字段并使用 Maps 应用。
确保 Nginx 日志包含可解析的真实客户端 IP
Nginx 默认记录的是代理后 IP(如 127.0.0.1),需改用 $remote_addr 或更可靠的 $http_x_forwarded_for(配合可信代理配置)。推荐在 nginx.conf 的 log_format 中显式记录:
log_format geo_log '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time $upstream_response_time';同时在 server 块中启用 set_real_ip_from 和 real_ip_header,确保 X-Forwarded-For 被安全信任。
用 Ingest Pipeline 实现轻量级 GeoIP 解析(推荐)
相比 Logstash,Elasticsearch 内置的 Ingest Pipeline 更简洁、低延迟。创建一个 pipeline,调用 geoip 处理器解析 IP 字段(如 clientip 或你日志中对应的字段):
- 进入 Kibana → Stack Management → Ingest Pipelines → Create pipeline
- 添加处理器:GeoIP → 字段选
clientip→ 数据库选GeoLite2-City(需提前下载并配置到 ES) - 勾选 “Add location object” → 输出字段设为
geoip.location(这是 Kibana Maps 必需的 geo_point 类型) - 保存后,在索引模板或 Filebeat/Kafka 输入中指定该 pipeline 名称
在 Kibana Maps 中创建访问热力图或标记图
确认索引中 geoip.location 字段类型为 geo_point(可在 Index Patterns 中检查)。然后:
- 打开 Kibana → Maps → Create a new map
- 添加 Layer → Choose source → 选对应 Nginx 索引
- Layer type 选 “Region map”(按国家/城市聚合)或 “Coordinate map”(点图/热力图)
- Geospatial field 选
geoip.location - 可叠加筛选器:比如只看状态码 200 的请求,或按时间范围聚焦最近 24 小时
优化显示效果与排查常见问题
地图空白?热力不集中?大概率是数据链路某环出错:
- 检查
geoip.country_name或geoip.city_name是否有值(用 Discover 查几条原始文档) - 确认
geoip.location是对象结构:{"lat": 39.9, "lon": 116.4},不是字符串 - 如果用了 CDN 或反向代理,且未正确配置 real_ip,所有 IP 可能都变成同一个(如 10.x.x.x),导致地图全挤在内网位置
- 免费版 GeoLite2 数据库每月需手动更新,过期后解析会失败,建议设置 cron 自动下载











