前言
客户端的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" 根据输入框进行用户注册
注意邮箱一定要正确,注册后会发邮件进行确认及修改密码。
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两个离线库文件的定时更新。
创建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