最近有個需求是根據用戶的地理位置,訪問不同的服務器,比如國外用戶訪問國外的服務器,國內的用戶訪問國內的服務器,實現的思路主要兩種:
- 智能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; }