基于 Nginx + GeoLite2 搭建简易 IP 查询工具
内容提要
作者因频繁调用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服务时隐私如何保护?
该站点不记录访问日志,以节约服务器资源并保护用户隐私。