centos7 下 安裝GeoIP2,在nginx中根據ip地址對應的國家轉發請求


最近有個需求是根據用戶的地理位置,訪問不同的服務器,比如國外用戶訪問國外的服務器,國內的用戶訪問國內的服務器,實現的思路主要兩種:

  1. 智能dns,這個需要在阿里雲中注冊為企業版才有提供
  2. 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,還以為是錯的)

基本的安裝思路:

  1. 從https://github.com/leev/ngx_http_geoip2_module.git 拉取geoip2的源碼
  2. 結合nginx的源碼,通過add-dynamic-module或者add-module,兩者的區別在於,動態加載模塊還是靜態加載,我這里采用的是靜態加載方便以后直接拷貝到別的服務器,而且不需要load_module 
  3. 如果沒有裝過nginx,則使用make install,如果裝過則使用make,完成編譯后在objs中可以找到nginx,然后替換已有的nginx,替換之前可以備份。重啟nginx后,可以使用nginx -V來查看是否得到了帶geoip2擴展的nginx

得到帶擴展的nginx后,就需要獲取geoip2的數據文件,后續需要在nginx中使用,獲取數據文件的方式也有兩種:

  1. 到官方網站下載,https://www.maxmind.com/,注冊后,可以在后台找到Download Databases,可以手動下載(缺點:每次需要登錄網站下載,完成后,在傳到服務器上)
  2. 使用geoipupdate這個命令,根據官網的介紹,只要配置好GeoIP.conf,一個命令就可以完成數據文件的更新

我們采用第二種方式

  1. 先去官網完成注冊,而后根據提示找到License Keys,創建一個license,完成后會提示下載GeoIP.conf。
  2. 在服務器上安裝geoipupdate,安裝這個命令之前,先卸載自己服務器上已經安裝的版本(不知道為什么服務器是什么時候裝的舊版本),使用yum remove geoipupdate或者yum remove geoip完成卸載。
  3. 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 查看安裝后的版本
  4.  將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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM