geo2nginx工具怎么用?一文教你把GeoIP数据转成Nginx配置

geo2nginx工具怎么用?一文教你把GeoIP数据转成Nginx配置

你是不是也遇到过这种头疼事,明明配好了Nginx,结果地域限制要么全拦要么全放,根本不管用?这篇我就把geo2nginx这个神器掏出来,手把手教你怎么把MaxMind的GeoIP数据变成Nginx能直接读的配置,彻底解决地域访问控制的麻烦。

说实话,刚开始搞服务器的时候,我也觉得地域限制是个高大上的功能,得写一堆复杂的正则或者找什么第三方插件。后来才发现,其实Nginx原生就支持通过变量来判断IP所属地,只不过它需要一张“地图”,也就是那个IP段对应的国家或地区代码表。这个表太大了,手动写是不可能的,这时候geo2nginx就派上用场了。它就是个转换器,把你下载的GeoLite2-Country.mmdb文件,转化成Nginx能看懂的if语句块。

咱们先说说准备工作。你得先去MaxMind官网下载那个免费的GeoLite2数据库,格式选mmdb。别下错了,要是下了csv或者json,处理起来会麻烦不少。下载完放在服务器某个固定目录,比如/var/lib/geoip/下面。然后你得有个能跑Python的环境,因为geo2nginx是用Python写的脚本。现在大多数Linux发行版都自带Python3,装个pip就能搞定。

接下来就是重头戏了。打开终端,输入命令。这里有个小坑,很多人直接运行脚本,结果发现生成的文件巨无比,或者格式不对。其实关键在于参数。你要告诉脚本,你要生成的是Nginx的include文件,而且最好只包含国家代码,不包含具体的省份或者城市,那样文件太大,Nginx处理起来也慢。我一般用这个命令:python3 geo2nginx.py -c GeoLite2-Country.mmdb -o /etc/nginx/conf.d/geo_country.conf。注意看,输出路径一定要写对,而且最好放在conf.d目录下,这样Nginx启动时会自动加载。

生成完文件后,别急着重启Nginx。先打开那个生成的.conf文件瞅一眼。你会发现里面全是if ($geoip2_country_code ~ (CN|US|GB))这样的语句。这就是Nginx判断IP归属地的逻辑。接下来,你得在你的server块或者location块里引入这个文件。在nginx.conf里加一行include /etc/nginx/conf.d/geo_country.conf;。然后,在你的站点配置里,就可以写判断逻辑了。比如,你想屏蔽某些国家的访问,就可以写if ($geoip2_country_code !~ (CN|HK|MO)) { return 403; }。

这里有个细节要注意,geo2nginx生成的变量名默认是$geoip2_country_code,但如果你之前用过其他版本的geoip模块,变量名可能不一样。最好检查一下生成的文件头部的变量定义,确保你的if语句里用的变量名和生成的一致。不然Nginx重启会报错,或者判断永远不生效。

还有一个容易忽略的点,就是缓存。Nginx启动时会加载这个配置,但如果你更新了MaxMind的数据库,比如每个月更新一次IP段,你得重新运行geo2nginx脚本生成新的配置文件,然后reload Nginx。不然你的屏蔽列表还是旧的,新出现的IP段可能就没被拦下来。

我见过有人为了省事,直接把整个IP段都转成配置,结果那个文件几MB大,Nginx启动都要卡好几秒。其实没必要,只转国家代码就够了。大部分场景下,我们只关心是哪个国家的,不需要知道具体到城市。这样文件小,匹配速度快,服务器压力也小。

总之,用geo2nginx这个工具,真的是省了不少事。不用自己去维护那几万行的IP段映射,也不用担心格式写错。只要定期更新数据库,重新生成配置,地域限制这块就稳了。虽然中间有点小插曲,比如变量名对不上或者路径搞错,但一旦跑通了,后面就顺风顺水了。希望大家都能顺利搞定,别再为这个头疼了。