클 라 이언 트 그 레이스 케 일 발표, NGINX + GeoIP2 + GeoIP 데이터베이스

9646 단어 nginxmapgeoipAps
수요 발생 (지역 별 업데이트)
우리 회 사 는 전자상거래 플랫폼 을 만 드 는 것 입 니 다. 주요 상품 에는 스마트 정수기 제품 이 있 고 모든 스마트 정수기 제품 은 전국 고객 의 집에 설치 되 어 있 습 니 다.애프터서비스 유 지 를 위해 서 는 서버 에서 데 이 터 를 어떻게 저장 하고 이 를 전송 하 는 지 비교적 간단 하 다. 원 격 으로 정수기 의 잔액, 귀속 지, 출 수의 질 등 기능 을 보 여 주 는 것 은 정수기 자체 에 장 착 된 스마트 PAD 스크린 에 의 해 이 루어 진 것 이 고 PAD 내부 에 설 치 된 것 은 안 드 로 이 드 시스템 이다.새로운 기능 을 개발 하고 개발 한 후에 스마트 PAD 스크린 내부 안 드 로 이 드 시스템 APK 버 전 을 교체 해 야 할 때 버 전 을 업데이트 하 는 방법 은 모든 업 데 이 트 를 업데이트 하 는 데 어떠한 업데이트 상의 제한 도 하지 않 는 것 이다.그러나 업 무량 이 증가 함 에 따라 전국 에서 약 30 만 대의 수기 버 전이 갱신 되 어야 하기 때문에 이전의 갱신 방식 은 기 존의 이런 높 은 업 무량 의 수요 에 더 이상 적합 하지 않다.그래서 우 리 는 새로운 업데이트 방안 인 '지역 별로 업데이트' 를 고려 했다.
참고 안
1. 가장 직접적인 방안 은 아 리 클 라 우 드 의 CDN 을 구 매 하고 CDN 의 캐 시 를 이용 하여 실현 하 는 것 입 니 다.캐 시 원 리 는 다음 과 같다.
  • CDN 을 통 해 접근 하 는 절 차 는 클 라 이언 트 -- > CDN L1 - -- > CDN L2 - -- > 원본 사이트 입 니 다.
  • 클 라 이언 트 가 요청 한 CDN 노드 는 CDN 의 L1 노드 입 니 다. 클 라 이언 트 가 CDN 의 L1 노드 에 자원 을 요청 할 때 이 CDN 노드 는 이 노드 에 이 자원 이 있 는 지 확인 하고 이 자원 이 있 으 면 클 라 이언 트 에 게 바로 돌아 갑 니 다.이 자원 이 없 으 면 CDN L1 노드 는 CDN 의 L2 노드 에 자원 을 요청 하고, L2 노드 에 이 파일 을 캐 시가 있 으 면 L1 이 L2 에 데 이 터 를 받 아 클 라 이언 트 에 되 돌려 줍 니 다.L2 노드 에 도 이 자원 을 캐 시 하지 않 으 면 CDN 의 L2 노드 는 원본 으로 돌아 가 이 자원 을 요청 한 다음 에 클 라 이언 트 에 게 되 돌려 주 고 구체 적 인 캐 시 규칙 에 따라 이 자원 을 캐 시 합 니 다. 구체 적 인 캐 시 는 캐 시 규칙 에 따라 정 해 집 니 다. 캐 시가 만 료 되면 CDN 노드 는 이 자원 을 비 웁 니 다. 다음 에 클 라 이언 트 가 이 노드 에 요청 할 때 까지 기 다 립 니 다.CDN 에서 데 이 터 를 가 져 올 수 있 습 니 다.이 L2 노드 는 여러 개의 L1 노드 에 대응 하 는 것 입 니 다. 만약 에 L1 이 캐 시 에 명중 하지 않 으 면 L2 가 캐 시 에 명중 하면 최종 적 으로 캐 시 에 명중 합 니 다.
  • 원본 사이트 에서 APK 파일 을 업 데 이 트 했 고 CDN 캐 시가 만 료 되 지 않 았 다 면 고객 은 오래된 APK 데 이 터 를 요청 할 수 있 습 니 다.따라서 원본 사이트 에서 데 이 터 를 업데이트 한 후에 CDN 에 가서 캐 시 를 새로 고 쳐 야 합 니 다.
  • 나중에 프로젝트 원 가 를 고려 하 는 문 제 를 포기 했다.

  • 2. 그 레이스 케 일 로 발표
  • 각 프로젝트 의 불 균형 성 으로 인해 그 레이스 케 일 발 표 는 코드 층 에서 이 루어 진 것 이기 때문에 현재 이 구조 에 응용 하기 어렵다.
  • 이런 그 레이스 케 일의 방식 은 버 전 번호 에 따라 교체 하 는 것 이다. 즉, 전단 + CDN + Nginx 의 방식 이다.
  • 앞으로 개발 주기 가 길 고 관리자 의 원가 가 비교적 높다 는 것 을 토론 한 적 이 있다
  • 나중에 생각 은 Nginx 에 놓 였 고 Nginx + GeoIP Modules + GeoIP Datebase;
  • 전혀 생각 이 없어 요. 쓸 돈 은 써 야 죠.

  • Nginx+GeoIP Modules+GeoIP Datebase
  • Nginx 를 컴 파일 하여 제3자 모듈 을 도입 합 니 다. 여 기 는 컴 파일 에 성공 한 제3자 모듈 을 도입 해 야 합 니 다. 그렇지 않 으 면 끝 납 니 다.
  • GeoIP 라 이브 러 리 전송 문 을 다운로드 하여 / usr / share / GeoIP 디 렉 터 리 에 압축 을 풀 었 습 니 다.이러한 자원 은 네트워크 내 csdn 에서 비교적 세심 하 다.
  • 사용 시스템 은 CentOS 7.2 이상 버 전의 GeoIP 패키지 가 설치 되 어 있 지만 안 타 깝 게 도 자동 으로 라 이브 러 리 를 업데이트 하지 않 습 니 다.
  • "the GeoIP module requires the GeoIP library" 를 잘못 컴 파일 한 경우 yum install -y geoip-devel;
  • 컴 파일 후 make install 금지;
  • make 완료 후 / root / nginx - 1.14.2 / objs / nginx 를 nginx 응용 프로그램 디 렉 터 리 에 복사 하고 덮어 씁 니 다.
  • [root@node1-master nginx-1.14.2]# cd /usr/share/GeoIP
    [root@node1-master GeoIP]# gzip -d GeoLiteCity.dat.gz
    [root@node1-master GeoIP]# ln -sv GeoLiteCity.dat GeoCity.dat
    [root@node1-master ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz 
    [root@node1-master ~]# tar xf nginx-1.14.2.tar.gz && cd nginx-1.14.2 
    [root@node1-master nginx-1.14.2]# nginx -V
    [root@node1-master nginx-1.14.2]# ./configure \
    --user=nginx \
    --group=nginx  \
    --with-http_stub_status_module \
    --prefix=/usr/local/nginx \
    --conf-path=/usr/local/nginx/conf/nginx.conf \
    --with-threads \
    --with-http_ssl_module \
    --with-pcre --with-pcre=/usr/local/nginx/modules/pcre-8.30 \
    --with-http_realip_module \
    --with-http_gzip_static_module \
    --with-stream --with-http_slice_module \
    --with-cc-opt=-DTCP_FASTOPEN=23 \
    --add-module=/usr/local/nginx/modules/ngx_cache_purge-2.3 \
    --add-module=/usr/local/nginx/modules/nginx_upstream_check_module \
    --add-module=/usr/local/nginx/modules/file-md5-master \
    --add-module=/usr/local/nginx/modyles/nginx-sticky
    --with-http_geoip_module  //              geoip  
    [root@node1-master nginx-1.14.2]# make
    [root@node1-master nginx-1.14.2]# cp ./objs/nginx /usr/local/nginx/sbin/nginx
    [root@node1-master nginx-1.14.2]# nginx -V
       --with-http_geoip_module         
    

    Nginx 프로필 참조
    user root root;
    worker_processes  auto;
    worker_cpu_affinity auto;
    error_log /usr/local/nginx/logs/error.log  crit;
    pid /var/run/nginx.pid;
    worker_rlimit_nofile 65535;
    
    events {
    worker_connections 65535;
    multi_accept on;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    access_log logs/access.log  main;
    
    ##  GeoIP        ## 
    geoip_city /usr/share/GeoIP/GeoCity.dat;
    geoip_proxy 192.168.0.0/24;
    geoip_proxy 192.168.1.0/24;
    geoip_proxy_recursive on;
    
    ##  GeoIP      map        ,      ##
    map $geoip_city $no_allowed_region {
    default 1;
    Shanghai yes;
    Beijing yes;
    Tianjin yes;
    }
    
    server {
    listen 80;
    listen 443 default_server;
    server_name you.domain.com;
    ssl on;
    ssl_certificate  /usr/local/nginx/ssl/you.domain.com.crt;
    ssl_certificate_key  /usr/local/nginx/ssl/you.domain.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    root   /html;
    index index.html index.htm;
    try_files /index_$geoip_city.html ./index.html;
    
    location /static {
    root   /data;
        }
    location ~ ^/api/pad/available {
    default_type application/json;
    return 200 '{"success":true}';
        }
    #    #
    location /files/pad/yim-1.2.9.apk {
    imit_conn addr 10;
    limit_rate 100k;
    if ($no_allowed_region = 1) {
    return 550;
            }
        }
    #    #
    location /files/pad/yimpad-version.json {
    limit_conn addr 10;
    limit_rate 100k;
    if ($no_allowed_region = 1) {
    return 550;
            }
        }
    location ~ ^/static/water/material {
    root       /data/files;
    limit_conn addr 10;
    limit_rate 100k;
            }
        }
    }
  • apk 파일 과 일치 합 니 다. / files / pad / yimi - 1.2.9. apk 파일 에 접근 할 때 아래 설정 이 명중 되 었 습 니 다.if 판단 읽 기 map 명령 의 원본 변수 $geoipcity 의 값 은 다음 변수 $no 와 일치 합 니 다.allowed_region 의 값 이 일치 하면 줄 을 놓 습 니 다.다른 규칙 이나 비어 있 으 면 기본 규칙 과 일치 합 니 다. 기본 규칙 값 은 default 1 입 니 다. 기본 규칙 과 일치 하면 http 응답 상태 코드 에서 550 을 경고 코드 로 되 돌려 줍 니 다.
    location /files/pad/yimi-1.2.9.apk {
    root /data;
    limit_conn addr 10;
    limit_rate 100k;
    if ($no_allowed_region = 1) {
    return 550;
        }
    }
  • json 파일 과 일치 합 니 다. / files / pad / yimipad - version. json 파일 에 접근 할 때 아래 설정 이 명중 되 었 습 니 다.if 판단 읽 기 map 명령 의 원본 변수 $geoipcity 의 값 은 다음 변수 $no 와 일치 합 니 다.allowed_region 의 값 이 일치 하면 줄 을 놓 습 니 다.다른 규칙 이나 비어 있 으 면 기본 규칙 과 일치 합 니 다. 기본 규칙 값 은 default 1 입 니 다. 기본 규칙 과 일치 하면 http 응답 상태 코드 에서 550 을 경고 코드 로 되 돌려 줍 니 다.
    location /files/pad/yimipad-version.json {
    root /data;
    limit_conn addr 10;
    limit_rate 100k;
    if ($no_allowed_region = 1) {
    return 550;
        }
    }
    기본 블랙리스트 메커니즘 default 1, 즉 모든 요청 을 거부 합 니 다.map 설정 세그먼트 에 CITY = YES 를 추가 할 때 만 규칙 이 유효 합 니 다.

  • GeoIP 에서 GeoIP 2 로 업그레이드
  • 설치 개발 패키지 팀
  • [root@node1-master ~]# yum groupinstall -y Development Tools
    [root@node1-master ~]# yum install -y pcre-devel openssl openssl-devel zlib-devel
  • libmaxmindb 의존 라 이브 러 리 다운로드
  • official help site https://github.com/maxmind/libmaxminddb  
    [root@node1-master ~]# cd /usr/local/src && git clone --recursive https://github.com/maxmind/libmaxminddb
    [root@node1-master ~]# cd libmaxminddb
    [root@node1-master ~]# ./bootstrap
    [root@node1-master ~]# ./configure
    [root@node1-master ~]# make
    [root@node1-master ~]# make install
    [root@node1-master ~]# sh -c "echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf"
    [root@node1-master ~]# ldconfig
  • Nginx 를 부 드 럽 게 업그레이드 하고 컴 파일 (ngx http geoip 2 module) 모듈
  •   "Nginx+GeoIP Modules+GeoIP Datebase"  nginx   ,         
    [root@node1-master ~]# nginx -V
    [root@node1-master ~]# cd /usr/local/nginx/modules
    [root@node1-master ~]# git clone --recursive https://github.com/leev/ngx_http_geoip2_module
    [root@node1-master ~]# cd /root/nginx-1.14.2
    [root@node1-master nginx-1.14.2]# ./configure --     --add-module=/usr/local/nginx/modules/ngx_http_geoip2_module
    [root@node1-master nginx-1.14.2]# make 
    [root@node1-master nginx-1.14.2]# mv /usr/local/nginx/sbin/nginx{,.baks}
    [root@node1-master nginx-1.14.2]# cp objs/nginx /usr/local/nginx/sbin
    [root@node1-master nginx-1.14.2]# make upgrade
       make upgrade      "make: *** [upgrade] error 1"    kill nginx   ,    -c    nginx,    make upgrade
    [root@node1-master ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
       ngx_http_geoip2_module       ,          Nginx    1.9.11+
  • libmaxminddb 데이터베이스 파일 다운로드
  • official help site https://dev.maxmind.com/geoip/geoip2/geolite2
    [root@node1-master ~]# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
    [root@node1-master ~]# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
    [root@node1-master ~]# tar xf GeoLite2-City.tar.gz -C /usr/share/GeoIP2
    [root@node1-master ~]# tar xf GeoLite2-Country.tar.gz -C /usr/share/GeoIP2
  • nginx 설정 변경 GeoIP 내용 은 다음 과 같 습 니 다
  • ##geoip2 with##
    geoip2 /usr/share/GeoIP2/GeoLite2-City.mmdb {
    auto_reload 60m;
    $geoip2_metadata_city_build metadata build_epoch;
    $geoip2_data_city_name city names en;
    $geoip2_data_city_name default=Shanghai city names en;
    }
    
    ##map geoip##
    map $geoip2_data_city_name  $default_city_list {
    default 1;
    Shanghai yes;
    }
    
    ##server or location##
    if ($default_city_list = 1) {
            return 770;
    }
  • nginx 프로필 다시 불 러 오기 nginx -s reload
  • 테스트 명령 mmdblookup
  • 테스트 mmdb 데이터베이스 에서 데이터 경로 찾기 (국가 / 지역 이름 en)
  • mmdblookup --file /usr/share/GeoIP2/GeoLite2-City.mmdb --ip 49.7.20.53
  • 좋은 웹페이지 즐겨찾기