nginx的geoip模塊使用

網站需要根據不同的源地址轉發到不同的二級站點,可以通過ngx_http_geoip_module模塊實現。nginx默認不編譯這個模塊,需要編譯時開啓--with-http_geoip_module編譯選項。ngx_http_geoip_module 模塊創建變量,使用預編譯的MaxMind數據庫解析客戶端IP地址,得到變量值,然後根據變量的值去匹配判斷,所以要模塊依賴MaxMind GeoIP庫,GeoIP數據庫支持兩種格式CSV格式和二進制格式。

語法: geoip_country database

http {
geoip_country GeoIP.dat;
geoip_city GeoLiteCity.dat;
.............................
}

          
location / {
                if ($geoip_city_country_code ~ "US") {
                proxy_pass http://USA$request_uri;
                }
}

 

指定數據庫,用於根據客戶端IP地址得到其所在國家。 使用這個數據庫時,配置中可用下列變量:

$geoip_country_code

雙字符國家代碼,比如“RU”,“US”。

$geoip_country_code3

三字符國家代碼,比如“RUS”,“USA”。

$geoip_country_name

國家名稱,比如“Russian Federation”,“United States”。

這個二進制數據庫文件可以從maxmind官網下載

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

gzip -d GeoIP.dat.gz

mv GeoIP.dat /usr/local/nginx/conf/GeoIP.dat

 

但是這種使用二進制數據庫文件存在一個問題:數據庫不是很準確但由於是數據文件不能直接修改,所以我們使用自己收集整理的數據庫文件或者下載maxmind提供的cvs格式明文數據庫文件修改後再使用。

wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip

mv GeoIPCountryWhois.csv  /usr/local/nginx/conf/GeoIPCountryWhois.csv

 

然後使用一個perl腳本去整理這個文件並保存爲txt文件

geo2nginx.pl < GeoIPCountryWhois.csv > nginx_geoip.txt

wKiom1N8IemDqelYAACQJdevd1o957.jpg

修改nginx.conf

在http標籤裏增加如下

 geo $geoip_country {
    include nginx_geoip.txt;
    }
在location標籤裏修改如下

server {
        listen       80;
        server_name  linuxom.com;

        if ( $geoip_country ~ ^(?:CN)$ ){

        rewrite ^(.*) http://www.baidu.com$1 break;  //如果訪問的客戶端ip的code爲CN中國,那麼轉向到baidu
        }

        if ( $geoip_country ~ ^(?:US)$ ){

        rewrite ^(.*) http://www.sina.com.cn$1 break; //如果訪問的客戶端ip的code爲US美國,那麼轉向到sina

        }

平滑重啓nginx

/usr/local/nginx/sbin/nginx -s reload

測試1,使用中國IP地址

wKiom1N8JQWRd_kxAAGBQUi_dLs446.jpg

測試2,使用美國IP地址

wKioL1N8JPmTkmTWAAG-vaVRdDw807.jpg

總結:nginx的geoip模塊可以結合upstream來做不同地域的負載均衡,也可以像我的案例一樣根據客戶端的IP地址重定向到不同的分站點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章