Nginx Geoip2 处理不同国家 (或城市) 的访问

ar414-nginx-geoip2

前言

最近搞了一套AB站(不是acfun和bilibili,AB站:文中的AB站指的是同一个域名,可返回两种不同的资源),客户主要是做谷歌和FaceBook推广,A站是为了过审和过平台检查,B站是目标网站主要推广日本地区。
日本国家的用户访问 www.abc.com 看到的是B站,非日本国家的用户访问 www.abc.com 看到的是A站。

ar414-nginx-geoip2-1

当时想了三个方案,最终决定使用Nginx+GeoIP2

  • √ Nginx+GeoIP2
    • 可以拿到请求IP的国家和城市信息
    • 可以让开发者对于请求的IP进行各种个性化Nginx配置
    • 可以将请求IP的地理位置通过php-fpm传递php程序
  • 定时更新MaxMind免费数据库(GeoLite2-Country.mmdb + GeoLite2-City.mmdb)完成完美闭环
  • maxmind公司2002年成立至今,靠谱
  • × 使用IP识别接口:稳定的需要收费(也不能保证100%高可用:限频、响应时间、接口异常等因素),免费的无法保证稳定性,接口远远没有将GeoLite数据放在本地稳定
  • × DNS根据地域解析:cloudflare收费略贵,国内cloudxns已关闭免费服务(免费的东西说变就变,论planB的重要性)

TIPS:

  • 网上大部分都是GeoIP老版本的 已经不适用了,GeoIP依赖MaxMind的IP数据,需要频繁更新(自动化脚本定时更新)
  • 感兴趣又不懒的部署的朋友可直接跳到最后有docker体验

:computer:作者环境(2020.05.19)

  • CentOS7.2
  • libmaxminddb 1.3.2
  • Nginx 1.14.2

ar414

安装GeoIP2 依赖

$ wget https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz
$ tar -zxvf libmaxminddb-1.3.2.tar.gz
$ cd libmaxminddb-1.3.2
$ ./configure && make && make install
$ echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf 
$ ldconfig

下载GeoIP数据

$ git clone https://github.com/ar414-com/nginx-geoip2
$ cd nginx-geoip2
$ tar -zxvf GeoLite2-City_20200519.tar.gz
$ mv ./GeoLite2-City_20200519/GeoLite2-City.mmdb /usr/share/GeoIP/
$ tar -zxvf GeoLite2-Country_20200519.tar.gz
$ mv ./GeoLite2-Country_20200519/GeoLite2-Country.mmdb /usr/share/GeoIP/
$ # /usr/share/GeoIP 目录不存在的话可自己创建,Tips:不一定要放在这 随便放在哪
$ # Nginx配置的时候才需要用到数据路径 

将 GeoIP2 模块编译到 Nginx 中

下载GeoIP2模块

$ cd ~
$ git clone https://github.com/ar414-com/nginx-geoip2

编译到已安装的Nginx

1. 查看nginx安装目录nginx -V > --prefix=/www/server/nginx

ar414-nginx-geoip2-2

2. 原封不动带上之前的编译参数,再在后面添加Geoip2的模块参数

--add-module=/root/nginx-geoip2/ngx_http_geoip2_module

$ cd /www/server/nginx 
$ ./configure --user=www --group=www \ 
--prefix=/www/server/nginx \ 
--with-openssl=/www/server/nginx/src/openssl \ 
--add-module=/www/server/nginx/src/ngx_devel_kit \    
--add-module=/www/server/nginx/src/lua_nginx_module \ 
--add-module=/www/server/nginx/src/ngx_cache_purge \ 
--add-module=/www/server/nginx/src/nginx-sticky-module
--add-module=/www/server/nginx/src/nginx-http-concat \ 
--with-http_stub_status_module --with-http_ssl_module \ 
--with-http_v2_module --with-http_image_filter_module \ 
--with-http_gzip_static_module --with-http_gunzip_module \ 
--with-stream --with-stream_ssl_module --with-ipv6 \ 
--with-http_sub_module --with-http_flv_module \ 
--with-http_addition_module --with-http_realip_module \ 
--with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 \ 
--with-ld-opt=-ljemalloc \ 
--add-module=/root/nginx-geoip2/ngx_http_geoip2_module 
$ make 
$ rm -f /www/server/nginx/sbin/nginx.old 
$ mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.old 
$ cp ./objs/nginx /www/server/nginx/sbin/nginx 
$ make upgrade 
$ #检查是否安装成功
$ nginx -V 

重新安装Nginx

简约安装,方便测试

$ wget https://nginx.org/download/nginx-1.14.2.tar.gz
$ tar zxvf nginx-1.14.2.tar.gz
$ cd nginx-1.14.2
$ ./configure --user=www --group=www \
--prefix=/www/server/nginx  \
--add-module=/root/nginx-geoip2/ngx_http_geoip2_module
$ make && make install

:checkered_flag:使用 GeoIP2

http{
    ...
    
    geoip2 /usr/local/share/GeoIP/GeoLite2-Country.mmdb {
          $geoip2_country_code country iso_code;
    }
    
    map $geoip2_country_code $is_jp_country {
        default no;
        JP yes;
    }
    
    server {
        listen       80;
        server_name  localhost;
        #加上响应头方便调试
        add_header country $geoip2_country_code;
        
     
        location / {
        
            set $rootpath html/a;
            if ($is_jp_country = no) {
              set $rootpath html/b;
            }

            add_header rootpath $rootpath;
            add_header country $geoip2_country_code;
            root $rootpath;

            index index.html index.htm;
        
        }
    }
}

docker 体验

感兴趣又懒得弄的朋友可直接作者上传的镜像进行体验

获取镜像

$ docker pull ar414/nginx-geoip2

运行

$ docker run -it -d -p 80:80 -p 443:443 --rm ar414/nginx-geoip2

测试

国内访问

ar414-nginx-geoip2-3

ar414-nginx-geoip2-4

日本访问

ar414-nginx-geoip2-5

ar414-nginx-geoip2-6
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342