centos7 下 安装GeoIP2,在nginx中根据ip地址对应的国家转发请求
最近有个需求是根据用户的地理位置,访问不同的服务器,比如国外用户访问国外的服务器,国内的用户访问国内的服务器,实现的思路主要两种:
- 智能dns,这个需要在阿里云中注册为企业版才有提供
- nginx中使用geoip这个扩展
升级企业版需要用户的身份认证,比较麻烦,所以决定采用第二钟办法,准备好时间开搞。
网上搜索了下nginx安装GeoIP,才发现geoip这个库已经过时了,现在nginx推荐使用geoip2这个库,我们可以从nginx的扩展的网站上看到。
而且geoip数据库已经不更新了,官方也不提供下载了(http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry,这个地址下的文件无效),搜索到的数据文件都是8年前的。
辛苦找到的一些参考资料,瞬间就感觉没什么用了,比如:
https://blog.csdn.net/tadwork/article/details/80742904
https://blog.csdn.net/guyan0319/article/details/78845159
https://blog.csdn.net/weixin_33938733/article/details/92048497
https://www.cnblogs.com/wenyule/p/11071800.html(文章中居然说:geoip2已经有了,安装另寻),看到这句话,有点子失落。
https://www.wandouip.com/t5i172594/
https://blog.csdn.net/u012600104/article/details/80887422
so,只能去找geoip2的使用。
经过baidu,google发现了下列参考文章:
https://www.getpagespeed.com/server-setup/nginx/upgrade-to-geoip2-with-nginx-on-centos-rhel(一开始感觉如获至宝,敲完命令后发现,cnm居然要订阅才能yum install,本来这个库就是免费的,这么搞有意思吗)
关键文章在这里:
https://www.westidc.top/archives/469
https://www.azio.me/how-to-install-ngx_http_geoip2_module/
https://www.24kplus.com/linux/404.html(链接404,还以为是错的)
基本的安装思路:
- 从https://github.com/leev/ngx_http_geoip2_module.git 拉取geoip2的源码
- 结合nginx的源码,通过add-dynamic-module或者add-module,两者的区别在于,动态加载模块还是静态加载,我这里采用的是静态加载方便以后直接拷贝到别的服务器,而且不需要load_module
- 如果没有装过nginx,则使用make install,如果装过则使用make,完成编译后在objs中可以找到nginx,然后替换已有的nginx,替换之前可以备份。重启nginx后,可以使用nginx -V来查看是否得到了带geoip2扩展的nginx
得到带扩展的nginx后,就需要获取geoip2的数据文件,后续需要在nginx中使用,获取数据文件的方式也有两种:
- 到官方网站下载,https://www.maxmind.com/,注册后,可以在后台找到Download Databases,可以手动下载(缺点:每次需要登录网站下载,完成后,在传到服务器上)
- 使用geoipupdate这个命令,根据官网的介绍,只要配置好GeoIP.conf,一个命令就可以完成数据文件的更新
我们采用第二种方式
- 先去官网完成注册,而后根据提示找到License Keys,创建一个license,完成后会提示下载GeoIP.conf。
- 在服务器上安装geoipupdate,安装这个命令之前,先卸载自己服务器上已经安装的版本(不知道为什么服务器是什么时候装的旧版本),使用yum remove geoipupdate或者yum remove geoip完成卸载。
- 在https://github.com/maxmind/geoipupdate/releases下载对应的rpm文件,我这里下载的是geoipupdate_4.2.2_linux_amd64.rpm,rpm -i geoipupdate_4.2.2_linux_amd64.rpm 完成安装,geoipupdate -V 查看安装后的版本
- 将GeoIP.conf上传到服务器的 /etc目录下,执行geoipupdate,完成数据文件的下载,下载的数据文件放在,/usr/share/GeoIP,GeoLite2-ASN.mmdb,GeoLite2-City.mmdb,GeoLite2-Country.mmdb
接下来,我们可以在nginx中用geoip2的扩展命令,来调用这些数据文件,并做相应的转发。
在nginx的http下面加入:
#/usr/share/GeoIP/GeoLite2-Country.mmdb 替换为实际路径 geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { auto_reload 60m; $geoip2_metadata_country_build metadata build_epoch; $geoip2_data_country_code country iso_code; $geoip2_data_country_name country names en; } #/usr/share/GeoIP/GeoLite2-City.mmdb 替换为实际路径 geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb { auto_reload 60m; $geoip2_data_city_name city names en; }
在location下加入:
# 根据国家代码跳转,不要使用proxy_pass,proxy_pass会生成301的永久重定向,这样如果需要变更跳转,需要强制刷新浏览器的缓存
if ($geoip2_data_country_code != "CN"){ rewrite ^(.*) http://www.baidu.com break; }