首页 > 编程语言 > PHP > 关于GEOIP和GEOIP2区别,以及NGINX和PHP使用GEOIP/GEOIP2方法

关于GEOIP和GEOIP2区别,以及NGINX和PHP使用GEOIP/GEOIP2方法

PHP WEB软件 系统软件

由于网站活动需要做一些针对地区的活动页面显示,不同地区打开不同的活动页,当然有些CDN和DNS也可以做到,只是一般都收费和麻烦一些.而且又不要求那么高的准确性,就看了下geoip的使用.

 

一、GEOIP和GEOIP2的区别

Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。
IP地理定位本质上是不精确的,地点通常靠近人口中心。GeoIP数据库提供的任何位置不应用于识别特定地址或家庭,使用精度半径作为IP地址返回的纬度和经度坐标的地理定位精度指示,IP地址的实际位置可能在这个半径和经纬度坐标所定义的区域内。

GEOIP目前已经发展到GEOIP2,GEOIP的免费库GeoLite版本后缀为.dat(有国家/城市/ASN等),GEOIP2的免费库GeoLite2版本后缀为.mmdb(有国家/城市/ASN等),GEOIP2的收费库GeoIP2 Enterprise版本后缀为.mmdb(有国家/城市/ASN等)

ASN(Autonomous System Number)是为每个大型网络分配的编号,该编号全球唯一。通过查询IP地址隶属的ASN编号,可以了解该IP地址隶属的网络运营商,以及大致的地址位置。Nmap提供asn-query脚本来查询IP地址的ASN编号,并给出BGP、区域、起始和节点编号等信息。需要注意的是 城市City 和 国家Country 库中不含ASN信息。

MaxMind 提供了免费的GEOIP数据库,坏消息是MaxMind 官方已经停止支持dat格式的ip库。在其他地方可以找到dat格式的文件,或者老版本的,当然数据不可能最新,多少有误差。

GEOIP的好处就是可以动态加载到NGINX等软件里,不需要重新源代码构建使用.而且GEOIP数据库和支持库可以yum安装.

GEOIP2 NGINX等软件使用必须重新源代码构建.

GeoLite2是GeoIP2的免费版本,与GeoIP2数据库相比准确性较差。GeoLite2数据库每周更新国家、城市和自治系统编号信息,更新时间为每周二。此前,MaxMind一直提供GeoLite2公开的访问下载地址,但从2019年12月30日开始,MaxMind不再提供GeoLite2公开的访问下载地址,需要用户注册一个MaxMind帐户并获取许可密钥,才能下载GeoLite2数据库。

 

以下操作都在Centos7的服务器,其他系统请自行相应变动:

二、GEOIP的安装以及NGINX和PHP使用方法

GEOIP的安装

1.yum安装的geoip

先装epel源(下面的yum安装环境都默认安装过epel源)

再装

想详细知道每个包作用可以查看下各个GEO包的说明,查看GeoIP的yum包说明:

安装GEOIP数据库yum包:

安装完成后在/usr/share/GeoIP/下出现2个dat数据库,2个软链(这个只有国家库/分IPv4和IPv6)

系统增加3个命令geoiplookup geoiplookup6 geoipupdate

geoiplookup查看IPv4,geoiplookup6查看IPv6,geoipupdate本来用于升级GEOIP数据库,但是官方停止维护所以下不到

如果有需要可以继续安装一下城市和AS数据库,查看GeoIP-data的yum包说明:

安装GeoIP-data的yum包:

安装完成后在/usr/share/GeoIP/下新出现4个dat数据库,4个软链(城市/ASN库/分IPv4和IPv6)

上面是GEOIP的数据库安装,下来安装GEOIP的支持库,查看GeoIP-devel说明:

安装GEOIP的支持库:

最后还有一个geoipupdate-cron可以安装,查看说明(就是geoipupdate的一个定时周升级任务):

安装geoipupdate-cron:

安装完成后在/etc/cron.weekly多出一个geoipupdate任务

geoipupdate都无法升级,所以这个也是没啥的用,完全不用装.

2.编译安装的geoip

由于安装GeoIP支持库由于官方地址的C API下载不到,所以没有测试也只是写出来看一下,也许其他地方还能找到:

安装完以后写入动态链接

应该是相当于yum install GeoIP-devel,不知道两者有什么区别,个人理解应该是相同的.

GeoIP数据库也可以单独下载,yum安装的GeoIP数据库是IPv4和IPv6分离的,也可以去第三方下载合并的

第三方下载地址(GeoLite的dat数据库):https://www.miyuru.lk/geoiplegacy

在IPv6/IPv4数据库中,IPv4 地址映射为 IPv6 地址

该产品包括 MaxMind 创建的 GeoLite2 数据,可从 https://www.maxmind.comIP Geolocation by DB-IP 获得

NGINX安装GeoIP模块

因为系统自带的nginx版本低,所以用了官方的yum源http://nginx.org/en/linux_packages.html#RHEL-CentOS

1.yum安装的nginx

安装完以后在nginx.conf里添加

然后server和location下面就可以写

此时CN的IP就会打开指定目录的页面.

关于nginx的geoip模块使用可以参考官方说明:http://nginx.org/en/docs/http/ngx_http_geoip_module.html

官方的plus版本有另外的插件可以参考下:https://docs.nginx.com/nginx/admin-guide/dynamic-modules/geoip/

plus版本(收费或试用)https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/

2.编译安装的nginx

默认nginx是不编译--with-http_geoip_module的,所以在编译的时候加上就可以了,省略号……代表以前编译过的模块

需要注意一点,如果没有安装过C API或者yum install GeoIP-devel的话,编译会报错(我是lnmp环境编译的nginx,也许单独编译nginx报错不一样):

PHP安装GeoIP模块

1.YUM安装的PHP

查看yum的php的geoip扩展包:

安装

2.编译安装的PHP

下载 GeoIP 的 PECL 扩展
下载地址  http://pecl.php.net/package/geoip

安装 GeoIP 的 PECL 扩展

验证安装成功没直接php模块输出或者phpinfo()里查看下,有输出就是安装好了,

使用方法看官方:https://www.php.net/manual/zh/book.geoip.php

3.nginx的fastcgi模式执行的php

还有一种方法可以让php不安装扩展使用geoip,就是在nginx的FASTCGI变量里

找到 http 段并加入如下以内容进行geoip 国家/地区查找:

保存并关闭文件。如果您想要城市级别的地理定位,请将其设置如下:

保存并关闭文件。最后,重新加载 nginx:

PHP测试脚本:

创建一个php测试脚本如下geoip.php

三、GEOIP2的安装以及NGINX和PHP使用方法

GEOIP2的安装

GeoIP2数据库下载:

MaxMind帐户注册地址:GeoLite2 Sign Up | MaxMind
直连访问,不要使用代理服务器,否则显示错误,无法注册

注册完成后,在许可密钥界面生成许可密钥(License key),妥善保管好你的许可密钥(License key)。
GeoLite2数据库的下载地址即为:https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=此处替换为证书密钥&suffix=tar.gz

GeoIP2数据库下载:
https://dev.maxmind.com/geoip/geoip2/geolite2/

官网提供三种库,2种格式, 首先 官网API是需要使用二进制库文件, CSV格式的库可以导入其他程序 或 供你简单浏览。
三种库的区别可以从名字上就可以看出来:
City 精确到城市(大小70M左右),
Country 精确到国家(4M左右),
ASN 用于产看IP地址的拥有者(7M左右). 需要注意的是 City 和 Country 库中不含ASN信息。

由于数据库经常更新, 官网还提供了更新的方案:
GeoIP2 Release Notes | MaxMind Developer Portal

除了自己注册下载以外,还可以使用网络上公开的Geolite2数据库
Releases · Dreamacro/maxmind-geoip · GitHub
https://geolite.clash.dev
https://static.clash.to/GeoIP2/GeoIP2-Country.tar.gz
很多linux版本支持这个库, 可以使用yum 或 apt 进行下载, windows上使用的话就需要自己编译了.

yum可以安装geolite2,先查看说明:

安装

安装完成后/usr/share/GeoIP/会多出2个库GeoLite2-City.mmdb和GeoLite2-Country.mmdb

GeoIP2支持库安装:

可以直接yum安装libmaxminddb,先查看说明:

安装GeoIP2支持库:

安装完成后系统增加一个mmdblookup命令,可以用于查看mmdb库的IP信息

 

也可以代码编译

应该相当于yum install libmaxminddb libmaxminddb-devel,个人理解是相同的

Geolocate an IP address using Web Services with the client-side JavaScript | MaxMind Developer Portal
GeoIP2提供了多种语言的API接口供选择.
https://github.com/maxmind/libmaxminddb/releases

NGINX安装GeoIP2模块

1.yum安装的nginx

普通版没找到yum安装方法,plus版本有个插件官方https://docs.nginx.com/nginx/admin-guide/dynamic-modules/geoip2/

plus版本(收费或试用)https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/

如果有安装成功的,应该和geoip一样引入一下so文件

2.编译安装:

https://github.com/leev/ngx_http_geoip2_module

然后找到nginx源码,省略号……代表以前编译过的模块

可以静态模块:

也可以添加动态模块:

如果需要流支持:

nginx配置同上,只是不用写so引入就行了.

 

PHP安装GeoIP2模块

1.yum安装的php

yum可以先查看下说明:

安装

安装完成可以看下php示例

2.编译安装的php

可以用composer安装一下GeoIP2-PHP或DB-Reader-php

如何安装和使用PHP版GeoIP2-PHP:http://wiki.diahosting.com/amh4.2/geoip_for_geoip2_php

如何安装和使用PHP版的DB-Reader-php:http://wiki.diahosting.com/amh4.2/geoip_for_db_reader_php

3.nginx的fastcgi变量

和geoip的方法相同,就不多说了.

 

因为百度了不少教程和说明,结合自己操作整理的,所以有些可能乱或者不准,但是希望大家能理解使用方法就行,首先有IP库,不管是.dat还是.mmdb都是一个静态的二进制文件,这个文件可以放在任何地方,写对路径正常引用可读就行,下来就是安装支持库或者是api接口,让系统可以通过支持库或者接口解读IP库文件,最后就是装使用软件对应的插件,然后软件内引入插件指定好IP库位置(GeoIP和GeoIP2引入写法和变量不同),就可以正常使用了.