geoip

作用:

  • 国家地区访问控制
  • 国家地区择近选择
  • 获取客户端地区信息,用以分析

编译安装MaxMind 的 GeoIP 库

下载页面:https://dev.maxmind.com/geoip/legacy/downloadable/

wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
tar -zxvf GeoIP.tar.gz
cd GeoIP-1.4.6
libtoolize -f
./configure
make && make install

配置LD库

echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
ldconfig

重新编译nginx

获取之前的参数

nginx -V

加上--with-http_geoip_module

./configure ... --with-http_geoip_module
make; make install

下载 IP 数据库

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

gunzip GeoIP.dat.gz

测试

geoip_country /usr/local/src/GeoIP.dat;
server {
    listen   82;
    server_name geoip.lotusching.top;
    root     /opt/app/download;

    location / {
        default_type "text/plain";
        return 200 $geoip_country_code;
}

测试结果

[root@bj-vmware-test1 conf.d]# curl http://geoip.lotusching.top:82
CN

示例:限制国外用户访问

Nginx配置

location / {
    default_type "text/plain";
    if ($geoip_country_code = CN) {
         return 200 "China.";
    }
    return 403 "!!!Access Deny!!!";
}

示例:指定区域访问指定节点

location / {
    default_type "text/plain";
    if ($geoip_country_code = CN) {
        rewrite ^/(.*)$ http://cn.www.lotusching.top:82/$1 permanent;
    }
    return 403 "!!!Access Deny!!!";
    rewrite ^/(.*)$ http://us.www.lotusching.top:82/$1 permanent;
}

这里用了permanent,效果体现在客户端收到一个301 Moved Permanently后,后续的请求就会自动的请求这个跳转后的地址

这么做优点在于,减少主站请求压力,缺点在于主站判断策略更新,客户端无法即时的使用最新的策略

补充资料

日志输出国家地区城市

https://thecustomizewindows.com/2016/10/configure-nginx-access-log-geoip-ubuntu-16-04/

nginx配置文件

root@f9a7c95dbe26:/etc/nginx# cat nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

load_module "modules/ngx_http_geoip_module.so";

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"'
    #                  '"$geoip_country_name" "$geoip_country_code"'
    #                  '"$geoip_region" "$geoip_region_name"'
    #                  '"$geoip_city", "$geoip_city_country_name"';

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$geoip_country_name", "$geoip_city"';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # GeoIP
    geoip_country /etc/nginx/geoip/GeoIP.dat;
    geoip_city /etc/nginx/geoip/GeoLiteCity.dat;

    include /etc/nginx/conf.d/*.conf;
}

日志输出

45.121.65.171 - - [22/Mar/2018:03:18:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-""China", "Beijing"

问题汇总

编译geoip报错

libtool: Version mismatch error.  This is libtool 2.4.2 Debian-2.4.2-1.7ubuntu1, but the
libtool: definition of this LT_INIT comes from libtool 2.4.6.
libtool: You should recreate aclocal.m4 with macros from libtool 2.4.2 Debian-2.4.2-1.7ubuntu1
libtool: and run autoconf again.
make[1]: *** [GeoIP.lo] Error 63
make[1]: Leaving directory `/tmp/GeoIP-1.6.12/libGeoIP'
make: *** [all-recursive] Error 1

解决方法:

# autoreconf --force --install
# ./configure && make && make install

缺少GeoIPLiteCity.dat

用自己腾讯服务器上备份的。

results matching ""

    No results matching ""