網站需要根據不同的源地址轉發到不同的二級站點,可以通過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
修改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地址
測試2,使用美國IP地址
總結:nginx的geoip模塊可以結合upstream來做不同地域的負載均衡,也可以像我的案例一樣根據客戶端的IP地址重定向到不同的分站點。