前言

客户端的IP地址信息是用户行为分析的基础数据,通过该信息可以定位到用户所在的国家、城市、经纬度等。

获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务。

如国内的ipip.net,国外的ip-api.com、maxmind.com等。

很多公司都是使用Maxmind网站的IP信息库,里面包含着IP的详细信息,有付费的也有免费的,收费与免费的区别就是精准度和覆盖率。

 

一、准备工作

收费与免费的区别就是精准度和覆盖率。

1.注册及申请License Key

下载地址库之前先要在Maxmind网站注册同意相应的协议并登陆。

1.1.用户注册

访问 https://dev.maxmind.com/geoip/geolite2-free-geolocation-data

 

点击"Sign Up for GeoLite2" 根据输入框进行用户注册
Maxmiand注册表单
注意邮箱一定要正确,注册后会发邮件进行确认及修改密码。

1.2.用户登录

根据注册的用户名和修改后的密码+邮箱的邮箱Code,登陆就可以直接下载离线包了。

点击"Download Databases"进入到下载页面,可以看到提供了CSV及mmdb两种格式的离线库包,最近的更新时间为2023年05月12日。

1.3.申请License Key

由于IP地址信息是经常有变化的,Maxmind提供了geoipupdate工具来更新离线地址包。

该工具使用需要申请账号和License Key。

还是通过刚注册的引导页面,点击“Generate a License Key”

进如到页面后,点击“Generate new license key”

点击确定以后就会生成账号及License key

2.下载geoipupdate工具

由于IP地址信息是实时变化的,Maxmind在GitHub上提供了1个Golang语言编写的GeoIP数据库更新工具(geoipupdate),该工具帮助我们定期更新远程的GeoIP库到本地

发行版本下载地址 https://github.com/maxmind/geoipupdate/releases

wget https://github.com/maxmind/geoipupdate/releases/download/v4.8.0/geoipupdate_4.8.0_linux_amd64.tar.gz
tar -zxvf geoipupdate_4.8.0_linux_amd64.tar.gz 
cd geoipupdate_4.8.0_linux_amd64

目录执行ls -alh查看目录内容,发现有两个关键文件:getipupdate命令执行文件和GeoIP.conf配置文件

[root@node2 home]# ls
geoipupdate_4.8.0_linux_amd64  geoipupdate_4.8.0_linux_amd64.tar.gz  zhanggen
[root@node2 home]# cd geoipupdate_4.8.0_linux_amd64/
[root@node2 geoipupdate_4.8.0_linux_amd64]# ls
CHANGELOG.md  GeoIP.conf  GeoIP.conf.md  geoipupdate  geoipupdate.md  LICENSE-APACHE  LICENSE-MIT  README.md

3.配置geoipupdate

在geoip更新工具的配置文件中,配置你申请AccountID、LicenseKey(开始在Maxmind网站上申请的),并指定DatabaseDirctory。

4.运行geoipupdate工具

[root@node2 geoipupdate_4.8.0_linux_amd64]# ./geoipupdate -f ./GeoIP.conf  -v --stack-trace
geoipupdate version 4.8.0
Using config file ./GeoIP.conf
Using database directory /usr/local/share/GeoIP
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
Acquired lock file lock (/usr/local/share/GeoIP/.geoipupdate.lock)
Performing update request to https://updates.maxmind.com/geoip/databases/GeoLite2-Country/update?db_md5=00000000000000000000000000000000
Performing get filename request to https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-City
Acquired lock file lock (/usr/local/share/GeoIP/.geoipupdate.lock)
Performing update request to https://updates.maxmind.com/geoip/databases/GeoLite2-City/update?db_md5=00000000000000000000000000000000

执行geoipupdate命令完成之后,在database directory中产生了GeoLite2-City.mmdb、GeoLite2-Country.mmdb两个离线库文件。

[root@node2 GeoIP]# pwd
/usr/local/share/GeoIP
[root@node2 GeoIP]# ls
GeoLite2-City.mmdb  GeoLite2-Country.mmdb
[root@node2 GeoIP]# 

5.定时运行geoipupdate工具

通过crontab定时执行geoipupdate命令,可以保证GGeoLite2-City.mmdb、GeoLite2-Country.mmdb两个离线库文件的定时更新。

GeoLite2离线库文件
创建Linux定时任务,每周自动更新一下离线库文件,起到离线数据库定时更新的效果。

crontab -e
0 0 * * 0 /home/geoipupdate_4.8.0_linux_amd64/geoipupdate -f /home/geoipupdate_4.8.0_linux_amd64/GeoIP.conf  -v --stack-trace

 

二、Web应用开启GeoIP

以上已经在本地建立了GeoIP库。

Java、Python等开发的Web应用程序、Nginx就可以根据当前的GeoIP库查询到,访问客户端的IP信息了。

客户端IP信息收集上传到ES之后,就可以为用户画像、安全,提供有价值的数据。

1.Flask读取geoip2数据库

1.1.下载第三方库

pip install geoip2

1.2.使用

from flask import Flask
import geoip2.database

app = Flask(__name__)
reader=geoip2.database.Reader('D:\GeoIP\GeoLite2-City.mmdb')
@app.route(
"/getip/<ip>") def getip(ip): ipinfo=reader.city(ip) ipinfo_json={'country':ipinfo.country.name,'city':ipinfo.city.name,'location':[ipinfo.location.longitude,ipinfo.location.latitude]} return ipinfo_json if __name__ == "__main__": app.run(host='127.0.0.1',port=8001)

1.3.验证

http://127.0.0.1:8001/getip/128.101.101.101

{"city":"Minneapolis","country":"United States","location":[-93.2188,44.9402]}

可以看到返回IP的国家、城市、经纬度等信息。

2.Nginx使用GeoIP

Nginx作为用户访问的入口也可以使用GeoIP功能。

2.1.http配置配置段

在http末尾添加(路径为GeoLite2-City.mmdb的存放路径)

geoip2 /data/geoip/GeoLite2-City.mmdb {
$geoip2_data_city_name default=Beijing city names en;
}

2.2.server配置段

server里 location/{}后面跟上后面就可以编辑geoip2使用的功能了,用nginx语法)

add_header geoip2_data_city_name $geoip2_data_city_name;

2.3.其他维度信息

$geoip_country_code; - 两个字母的国家代码,如:”RU”, “US”。
$geoip_country_code3; - 三个字母的国家代码,如:”RUS”, “USA”。
$geoip_country_name; - 国家的完整名称,如:”Russian Federation”, “United States”。
$geoip_region - 地区的名称(类似于省,地区,州,行政区,联邦土地等),如:”30”。 30代码就是广州的意思
$geoip_city - 城市名称,如”Guangzhou”, “ShangHai”(如果可用)。
$geoip_postal_code - 邮政编码。
$geoip_city_continent_code。
$geoip_latitude - 所在维度。
$geoip_longitude - 所在经度。

2.4.k8s配置

deployment:
  spec:
    replicas: 3
    template:
      spec:
        containers:
        - command:
          - java
          - -server
          - -Xms4G
          - -Xmx4G
          - -XX:MaxNewSize=512M
          - -XX:MaxDirectMemorySize=512M
          - -Xss512K
          - -XX:+UseConcMarkSweepGC
          - -XX:CMSFullGCsBeforeCompaction=5
          - -XX:+UseCMSCompactAtFullCollection
          - -XX:CMSInitiatingOccupancyFraction=80
          - -XX:+HeapDumpOnOutOfMemoryError
          - -XX:HeapDumpPath=../logs/
          - -Dfile.encoding=UTF-8
          - -Dapp.name=bible-api
          - -jar
          - /app.jar
          env:
          - name: SPRING_PROFILES_ACTIVE
            value: prod
          name: app
          resources:
            limits:
              cpu: "3"
              memory: 6000Mi
            requests:
              cpu: "3"
              memory: 6000Mi
          volumeMounts:
          - mountPath: /usr/local/share/GeoIP
            name: geoipdir
        - name: apusagent
        initContainers:
        - name: initgeoip
        volumes:
        - name: geoipdir
service:
  spec:
    type: ClusterIP
ingress:
  spec:
    rules:
      - host: soul-api.kjvbiblenow.com
java.yaml

 

腾讯云GPU

参考

posted on 2023-05-12 20:17  Martin8866  阅读(864)  评论(0编辑  收藏  举报