nginx之geoip模块–针对地区访问控制


如果要做针对地区或者ip的访问控制,有比较多的办法,比如if ($remote_addr ~ 211.156.184.) {deny all;} ,匹配这个段的ip,直接返回403,如果要针对一系列的ip,一个地区,甚至经纬度,就不好做了,当然还有更加灵活的,就是用nginx自带的模块 geoip模块。

Nginx编译参数,关键是加了 http_geoip_module模块,需要geoip库支持yum -y install geoip-devel 或者在 http://pkgs.repoforge.org/geoip 这里下载,

nginx -V

nginx version: nginx/1.2.4
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-52)
TLS SNI support disabled
configure arguments: –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-google_perftools_module –with-http_ssl_module –with-http_realip_module –with-http_geoip_module

 

下载两个ip数据包直接放在nginxconf目录并解压:

axel http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
axel http://www.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

 

nginx.confhttp字段加载ip库:

geoip_country GeoIP.dat;
geoip_city GeoLiteCity.dat;

然后就在server里面设置即可。

比如:

location /{
    if ($geoip_city = Guangzhou) {
        root /data/web/guangzhou;
    }
    if ($geoip_region = “30″ ) {
        root /data/web/guangdong;
    }
}

 或者

if ($geoip_region = 30) {
    rewrite ^/index.html http://www.renzhemao.com/home.html permanent;
}

ip来自广东时候,把首页重定向到home.html.

或者

location /geoip/ {
    rewrite .* /?country=$geoip_country_code;
}

 当不确定具体是否有城市名可以用strings命令查看字符串,比如:

strings GeoLiteCity.dat |grep -i guangzhou

这样就匹配到了 Guangzhou ,所以我们可以用 Guangzhou这个城市名。

当然变量支持正则匹配,比如:
if ($geoip_region ~ “(30|31)”) 

 

我们测试时候可能不一定准,因为我们用的数据源是免费的,具体可以在官网查询:http://www.maxmind.com/en/geoip_demo

\

相应的省份代码:

CN,01,”Anhui”
CN,02,”Zhejiang”
CN,03,”Jiangxi”
CN,04,”Jiangsu”
CN,05,”Jilin”
CN,06,”Qinghai”
CN,07,”Fujian”
CN,08,”Heilongjiang”
CN,09,”Henan”
CN,10,”Hebei”
CN,11,”Hunan”
CN,12,”Hubei”
CN,13,”Xinjiang”
CN,14,”Xizang”
CN,15,”Gansu”
CN,16,”Guangxi”
CN,18,”Guizhou”
CN,19,”Liaoning”
CN,20,”Nei Mongol”
CN,21,”Ningxia”
CN,22,”Beijing”
CN,23,”Shanghai”
CN,24,”Shanxi”
CN,25,”Shandong”
CN,26,”Shaanxi”
CN,28,”Tianjin”
CN,29,”Yunnan”
CN,30,”Guangdong”
CN,31,”Hainan”
CN,32,”Sichuan”
CN,33,”Chongqing”

具体查询http://dev.maxmind.com/static/maxmind-region-codes.csv,也可以通过下载csv版本的ip库手动查询,比如搜索Guanzhou,会出现,”CN”,”30″,”Guangzhou”,这个30就是省份了。

变量支持多种类型,比如经纬度邮政编码之类的,不过都是模糊匹配,精度不高,不过也够用了。 更多变量请参考nginx模块参考手册:

http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:optionalhttpmodules:geoip

相关内容

    暂无相关文章