基于 Nginx + GeoLite2 搭建简易 IP 查询工具

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

作者因频繁调用ip.network被封锁,改用Nginx和MaxMind免费GeoLite2数据库搭建IP查询工具。通过Nginx的$remote_addr返回客户端IP,并集成geoip2模块加载国家、城市和ASN数据,提供基础IP、详细信息及JSON格式查询。服务已上线,支持自动更新数据库,不记录日志,保护隐私。

🔎

延伸解读

为何选择 Nginx 而非独立服务

作者原本依赖第三方服务 ip.network 获取公网 IP,但因调用频繁被封锁。改用 Nginx 后,利用其内置的 $remote_addr 变量即可直接返回客户端 IP,无需额外编写后端逻辑。这种方案轻量、高效,尤其适合已有 Nginx 环境的用户,能快速搭建一个自托管的 IP 查询服务,避免对外部服务的依赖。

GeoLite2 免费库的取舍

MaxMind 的 GeoLite2 数据库免费提供国家、城市和 ASN 信息,但精度和字段完整性不如商业版。作者指出,国家一级的数据基本准确,适合公益或轻量使用。用户需权衡免费与付费的差异,若对城市级精度或某些字段有严格要求,可能需要考虑商业版本。

Nginx 模块兼容性注意

Nginx 官方模块不支持 GeoLite2,而 Plus 版功能需付费。开源模块 ngx_http_geoip2_module 是替代方案,但若使用 nginx.org 的 Nginx 包,需手动编译动态模块。Ubuntu/Debian 源用户可直接安装 libnginx-mod-http-geoip2,简化部署。选择前需确认自己的 Nginx 来源,避免编译麻烦。

隐私与日志策略

作者强调服务不记录访问日志,以保护用户隐私。对于自建 IP 查询工具,日志策略是重要考量。不记录日志可减少敏感信息留存,但可能影响故障排查。用户可根据自身需求权衡,若需监控异常流量,可考虑匿名化日志或仅保留必要信息。

Q&A

如何用Nginx快速返回客户端公网IP?

配置一个server块,监听443端口,在location = /中使用return 200 '$remote_addr\n';即可返回客户端IP。若Nginx在负载均衡后,需用set_real_ip_from和real_ip_header修正$remote_addr。

为什么作者要搭建自己的IP查询工具?

作者因频繁调用ip.network(每五分钟一次)被该服务封锁,因此决定基于Nginx和MaxMind免费GeoLite2数据库自建IP查询服务。

GeoLite2数据库免费版和付费版有什么区别?

GeoLite2免费提供IP到国家、城市和运营商的映射,但数据精度略差,部分字段不完整或不提供;付费版数据更准确完整。

如何自动更新GeoLite2数据库?

在Ubuntu下使用geoipupdate工具,配置/etc/GeoIP.conf文件,包含AccountID、LicenseKey和EditionIDs(如GeoLite2-Country、GeoLite2-City、GeoLite2-ASN),然后启用geoipupdate.service定时服务。

Nginx官方geoip模块为什么不支持GeoLite2?如何解决?

Nginx官方ngx_http_geoip_module只支持老式GeoIP数据,不支持GeoLite2;官方GeoIP2模块仅限Plus用户。解决方案是使用开源的ngx_http_geoip2_module,可编译动态模块或安装libnginx-mod-http-geoip2包。

ip.zz.ac提供哪些查询接口?

提供三个接口:根路径返回客户端IP;/more返回IP、ASN和国家代码;/json返回JSON格式的详细信息,包括IP、国家、城市、经纬度、ASN和运营商。

使用ip.zz.ac服务时隐私如何保护?

该站点不记录访问日志,以节约服务器资源并保护用户隐私。

🏷️

标签

➡️

继续阅读