IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    admin发表于 2012-11-12 09:43:56
    love 0

        如果要做针对地区或者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数据包直接放在nginx的conf目录并解压:

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

     

    在nginx.conf的http字段加载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



沪ICP备19023445号-2号
友情链接