原文链接:http://blog.csdn.net/johnnycode/article/details/42028841

MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容、诈欺检测、广告定向、网站流量分析、执行规定、地理目标定位、地理围栏定位 (geo-fencing)以及数字版权管理。目前使用 GeoIP 更多是配合Nginx或Apache服务器进行日志分析获取网站访问量地域分布状况。

GeoIP 分为商业版和免费版,免费版比商业版精度差了许多,经测试对于城市定位确实有差距,能否接受看你的精度要求!

一、免费版本介绍:

1、GeoLite 版本,网上流传较广,数据库类型为 dat 格式文件,库文件较小未进行精准度测试。

2、GeoLite2版本,目前最新版本,数据库文件为 mmdb 格式文件,有兴趣了解 mmdb 格式的点这里 。

两者数据库文件大小比对,GeoLite2 特性点击这里

  1. $ du -sh *
  2. 32M GeoLite2-City.mmdb
  3. 2.3M    GeoLite2-Country.mmdb
  4. 18M GeoLiteCity.dat
  5. 732K    GeoLiteCountry.dat

City 文件为包含城市信息数据库,Country 文件为国家信息数据库。

二、下载 GeoLite2 数据库
下载方式分为两种,第一种通过下载 gz 压缩包,第二种通过使用官方提供的下载更新程序,建议使用第二种,官方称数据库在每个月的第一个星期二更新,如果想做成计划任务每月都更新建议选择第二种!GeoIP2详细更新日志点这里

两种方式这里都啰嗦一下,本阶段只是讲如何下载数据库,调用方式需要参考第三阶段 API 调用部分!

1、第一种方式,下载 gz 文件并解压缩。

GeoLite2 只提供 City 数据库和 Country 数据库下载 查看详情点击里,数据库文件分为 Binary 和 CVS 两种,这里使用 Binary 文件。

  1. $ sudo mkdir -p /mnt/data/geolite2 && cd $_
  2. $ sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
  3. $ sudo gzip -d GeoLite2-City.mmdb.gz
  4. $ sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
  5. $ sudo gzip -d GeoLite2-Country.mmdb.gz

2、第二种方式,需安装官方下载更新程序 geoipupdate 。

a、到 GitHub下载地址 下载 geoipupdate,目前最新版为 2.1.0,GitHub 连接速度要有耐心,肯定可以下载滴!编译文件需要 libcurl-devel 包支持,需提前下载安装。

  1. $ sudo yum install libcurl-devel -y
  2. $ sudo wget https://github.com/maxmind/geoipupdate/releases/download/v2.1.0/geoipupdate-2.1.0.tar.gz
  3. $ sudo tar xzvf geoipupdate-2.1.0.tar.gz
  4. $ cd geoipupdate-2.1.0
  5. $ sudo ./configure
  6. $ sudo make
  7. $ sudo make install

编译完毕只需要关注两个文件

更新执行文件 /usr/local/bin/geoipupdate

账户信息文件 /usr/local/etc/GeoIP.conf

b、配置账户信息 GeoIP.conf,修改配置文件如下即可,本配置文件默认下载 mmdb 文件,若想下载 dat 文件取消注释即可!

  1. # The following UserId and LicenseKey are required placeholders:
  2. UserId 999999
  3. LicenseKey 000000000000
  4. # Include one or more of the following ProductIds:
  5. # * GeoLite2-City - GeoLite 2 City
  6. # * GeoLite2-Country - GeoLite2 Country
  7. # * 506 - GeoLite Legacy Country
  8. # * 517 - GeoLite Legacy ASN
  9. # * 533 - GeoLite Legacy City
  10. # dat 格式数据库
  11. #ProductIds GeoLite2-City GeoLite2-Country 506 533
  12. # mmdb 格式数据库
  13. ProductIds GeoLite2-City GeoLite2-Country 132 106

c、执行更新

查看geoipupdate帮助文件,了解有哪些参数可以使用! -d 参数将文件下载到指定目录,-v 参数就是显示下载过程明细信息。

  1. $ /usr/local/bin/geoipupdate -h
  2. Usage: geoipupdate [-Vhv] [-f license_file] [-d custom directory]
  3. -d DIR   store downloaded files in DIR
  4. -f FILE  use configuration found in FILE (see GeoIP.conf(5) man page)
  5. -h       display this help text
  6. -v       use verbose output
  7. -V       display the version and exit

执行更新命令,下载速度看网络情况,本文将文件下载到 /mnt/data/geolite2/目录 。

$ ll /mnt/data/geolite2/ && cd $_
总用量 0
$ sudo /usr/local/bin/geoipupdate -d /mnt/data/geolite2/ -v
$ ll
总用量 34088
-rw-r--r--. 1 root root 32553611 12月 19 18:14 GeoLite2-City.mmdb
-rw-r--r--. 1 root root 2349406 12月 19 18:14 GeoLite2-Country.mmdb

如何配置计划任务定时更新 GeoLite2 数据库请自行解决。

三、安装 GeoLite2 API 调用程序

官方提供 .NET (C#)、C、Java、Perl、Python、Apache API调用。其他第三方接口也有,但官方不提供技术支持,详情点击这里

本文使用 C 语言API接口进行调用测试,为下篇文章Nginx与GeoIP2配合做铺垫。其他语言请参考官方指导自行解决!C语言API GitHub 下载地址

  1. $ sudo wget https://github.com/maxmind/libmaxminddb/releases/download/1.0.3/libmaxminddb-1.0.3.tar.gz
  2. $ sudo tar xzvf libmaxminddb-1.0.3.tar.gz
  3. $ cd libmaxminddb-1.0.3
  4. $ sudo ./configure
  5. $ sudo make
  6. $ sudo make install
  7. $ sudo ldconfig

查看帮助文档

  1. $ /usr/local/bin/mmdblookup --help
  2. mmdblookup --file /path/to/file.mmdb --ip 1.2.3.4 [path to lookup]
  3. This application accepts the following options:
  4. --file (-f)     The path to the MMDB file. Required.
  5. --ip (-i)       The IP address to look up. Required.
  6. --verbose (-v)  Turns on verbose output. Specifically, this causes this
  7. application to output the database metadata.
  8. --version       Print the program's version number and exit.
  9. --help (-h -?)  Show usage information.
  10. If an IP's data entry resolves to a map or array, you can provide
  11. a lookup path to only show part of that data.
  12. For example, given a JSON structure like this:
  13. {
  14. "names": {
  15. "en": "Germany",
  16. "de": "Deutschland"
  17. },
  18. "cities": [ "Berlin", "Frankfurt" ]
  19. }
  20. You could look up just the English name by calling mmdblookup with a lookup path of:
  21. mmdblookup --file ... --ip ... names en
  22. Or you could look up the second city in the list with:
  23. mmdblookup --file ... --ip ... cities 1
  24. Array numbering begins with zero (0).
  25. If you do not provide a path to lookup, all of the information for a given IP
  26. will be shown.

四、测试

1、获取国家信息,国家信息是正确滴,看着像乱码的地方是显示的俄语!

  1. $ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-Country.mmdb --ip 112.225.35.70
  2. {
  3. "continent":
  4. {
  5. "code":
  6. "AS" <utf8_string>
  7. "geoname_id":
  8. 6255147 <uint32>
  9. "names":
  10. {
  11. "de":
  12. "Asien" <utf8_string>
  13. "en":
  14. "Asia" <utf8_string>
  15. "es":
  16. "Asia" <utf8_string>
  17. "fr":
  18. "Asie" <utf8_string>
  19. "ja":
  20. "アジア" <utf8_string>
  21. "pt-BR":
  22. "Ásia" <utf8_string>
  23. "ru":
  24. "Азия" <utf8_string>
  25. "zh-CN":
  26. "亚洲" <utf8_string>
  27. }
  28. }
  29. "country":
  30. {
  31. "geoname_id":
  32. 1814991 <uint32>
  33. "iso_code":
  34. "CN" <utf8_string>
  35. "names":
  36. {
  37. "de":
  38. "China" <utf8_string>
  39. "en":
  40. "China" <utf8_string>
  41. "es":
  42. "China" <utf8_string>
  43. "fr":
  44. "Chine" <utf8_string>
  45. "ja":
  46. "中国" <utf8_string>
  47. "pt-BR":
  48. "China" <utf8_string>
  49. "ru":
  50. "Китай" <utf8_string>
  51. "zh-CN":
  52. "中国" <utf8_string>
  53. }
  54. }
  55. "registered_country":
  56. {
  57. "geoname_id":
  58. 1814991 <uint32>
  59. "iso_code":
  60. "CN" <utf8_string>
  61. "names":
  62. {
  63. "de":
  64. "China" <utf8_string>
  65. "en":
  66. "China" <utf8_string>
  67. "es":
  68. "China" <utf8_string>
  69. "fr":
  70. "Chine" <utf8_string>
  71. "ja":
  72. "中国" <utf8_string>
  73. "pt-BR":
  74. "China" <utf8_string>
  75. "ru":
  76. "Китай" <utf8_string>
  77. "zh-CN":
  78. "中国" <utf8_string>
  79. }
  80. }
  81. }

2、获取城市信息,这个数据就有点纠结了,省份没有问题,城市是有问题的! 官方演示地址 非常精准,也许这就是免费和收费的差别 :)

  1. $ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70
  2. {
  3. "city":
  4. {
  5. "geoname_id":
  6. 1805753 <uint32>
  7. "names":
  8. {
  9. "de":
  10. "Jinan" <utf8_string>
  11. "en":
  12. "Jinan" <utf8_string>
  13. "es":
  14. "Jinan" <utf8_string>
  15. "fr":
  16. "Jinan" <utf8_string>
  17. "ja":
  18. "済南市" <utf8_string>
  19. "pt-BR":
  20. "Jinan" <utf8_string>
  21. "ru":
  22. "Цзинань" <utf8_string>
  23. "zh-CN":
  24. "济南" <utf8_string>
  25. }
  26. }
  27. "continent":
  28. {
  29. "code":
  30. "AS" <utf8_string>
  31. "geoname_id":
  32. 6255147 <uint32>
  33. "names":
  34. {
  35. "de":
  36. "Asien" <utf8_string>
  37. "en":
  38. "Asia" <utf8_string>
  39. "es":
  40. "Asia" <utf8_string>
  41. "fr":
  42. "Asie" <utf8_string>
  43. "ja":
  44. "アジア" <utf8_string>
  45. "pt-BR":
  46. "Ásia" <utf8_string>
  47. "ru":
  48. "Азия" <utf8_string>
  49. "zh-CN":
  50. "亚洲" <utf8_string>
  51. }
  52. }
  53. "country":
  54. {
  55. "geoname_id":
  56. 1814991 <uint32>
  57. "iso_code":
  58. "CN" <utf8_string>
  59. "names":
  60. {
  61. "de":
  62. "China" <utf8_string>
  63. "en":
  64. "China" <utf8_string>
  65. "es":
  66. "China" <utf8_string>
  67. "fr":
  68. "Chine" <utf8_string>
  69. "ja":
  70. "中国" <utf8_string>
  71. "pt-BR":
  72. "China" <utf8_string>
  73. "ru":
  74. "Китай" <utf8_string>
  75. "zh-CN":
  76. "中国" <utf8_string>
  77. }
  78. }
  79. "location":
  80. {
  81. "latitude":
  82. 36.668300 <double>
  83. "longitude":
  84. 116.997200 <double>
  85. "time_zone":
  86. "Asia/Shanghai" <utf8_string>
  87. }
  88. "registered_country":
  89. {
  90. "geoname_id":
  91. 1814991 <uint32>
  92. "iso_code":
  93. "CN" <utf8_string>
  94. "names":
  95. {
  96. "de":
  97. "China" <utf8_string>
  98. "en":
  99. "China" <utf8_string>
  100. "es":
  101. "China" <utf8_string>
  102. "fr":
  103. "Chine" <utf8_string>
  104. "ja":
  105. "中国" <utf8_string>
  106. "pt-BR":
  107. "China" <utf8_string>
  108. "ru":
  109. "Китай" <utf8_string>
  110. "zh-CN":
  111. "中国" <utf8_string>
  112. }
  113. }
  114. "subdivisions":
  115. [
  116. {
  117. "geoname_id":
  118. 1796328 <uint32>
  119. "iso_code":
  120. "37" <utf8_string>
  121. "names":
  122. {
  123. "en":
  124. "Shandong Sheng" <utf8_string>
  125. "zh-CN":
  126. "山东省" <utf8_string>
  127. }
  128. }
  129. ]
  130. }

测试IP1:112.225.35.70 山东省青岛市,定位错误。

测试IP2:115.29.113.101 浙江省杭州市,定位正确。

测试IP3:112.124.127.64 浙江省杭州市,定位正确。

测试IP4:180.153.214.152 上海市,定位正确。

因为获取的数据是 Json 格式,所以根据帮助文档提示可以对内容进行格式化输出,如输出城市数据库中 city->names->zh-CN 内容

  1. $ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70 city names zh-CN
  2. "济南" <utf8_string>

获取省份要注意一点,省份是个数组,无意中发现每个版本的获取方式还不一样,注意版本区别!

  1. $ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70 subdivisions 0 names en
  2. "Shandong Sheng" <utf8_string>

虽然 GeoIP2 免费数据库在城市定位分析的不是很理想,但对我来说精度可以接受,聊胜于无嘛!

通过GeoIP2分析访问者IP获取地理位置信息的更多相关文章

  1. 通过ip获取地理位置信息

    http://ipinfo.io/developers 直接使用get请求  url: http://ipinfo.io/json    即可获得json数据

  2. [日志分析]Graylog2进阶之获取Nginx来源IP的地理位置信息

    如果你们觉得graylog只是负责日志收集的一个管理工具,那就too young too naive .日志收集只是graylog的最最基础的用法,graylog有很多实用的数据清洗和处理的进阶用法. ...

  3. PHP通过IP 获取 地理位置(实例)

    发布:JB02   来源:脚本学堂  分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码 ...

  4. PHP通过IP 获取 地理位置(实例代码)

    发布:JB02   来源:脚本学堂 分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码示 ...

  5. HTML5 获取地理位置信息

    HTML5增加的新功能,获取地理位置信息,如果浏览器支持且设备有定位功能,就能够直接使用这组API来获取当前信息位置.该Geolocation API可以应用于移动设备中的地理位置. Geolocat ...

  6. Html5 Geolocation获取地理位置信息

    Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置.基于此特性可以开发基于位置的服务应用.在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用. ...

  7. AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能

    HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...

  8. html5实现获取地理位置信息并定位

    这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...

  9. html5获取地理位置信息API

    html5获取地理位置信息API 在HTML5中,可以看下如何使用Geolocation API来获得用户的地理位置信息,如果该浏览器支持的话,且设备具有定位功能,就能够直接使用这组API来获取当前位 ...

随机推荐

  1. ALTERA MAX10官方评估板,新鲜出炉!

    刚刚拿到骏龙提供的ALTERA MAX10官方评估板,还热乎呢,呵呵!赶紧跟大家分享一下 板子很简单,把IO口都扩展出来了,其他功能基本上没有. FPGA型号是10M08SAE144C8GES,144 ...

  2. vim时,ctrl+s了一下,程序僵死了

    刚刚在用vim的时候,按了ctrl+s,然后僵死了,ctrl+c.ctrl+d都没有反应. 不知怎么回事,差点就把它kill了,想探探究竟,网上查了一下,原来原来,这是个快捷键. ctrl+s 锁定屏 ...

  3. [2016-06-28]dhclient命令的进程没杀死,导致不断在向DHCP服务器获取IP

    # Date:2016-06-28 # 问题:主机的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 已经配置好了静态的IP. 但隔几分钟主机的IP就自己变化 ...

  4. STL之multimap

    参见http://www.cplusplus.com/reference/map/multimap/ 多重映射multimap和map映射很相似,但是multimap允许重复的关键字,这使得multi ...

  5. 【BZOJ】【TJOI2015】线性代数

    网络流/最小割/最大权闭合图 2333好开心,除了一开始把$500^2$算成25000……导致数组没开够RE了一发,可以算是一次AC~ 咳咳还是回归正题来说题解吧: 一拿到这道题,我就想:这是什么鬼玩 ...

  6. Leetcode#127 Word Ladder

    原题地址 BFS Word Ladder II的简化版(参见这篇文章) 由于只需要计算步数,所以简单许多. 代码: int ladderLength(string start, string end, ...

  7. ios 百度地图

    百度地图  中的注意事项 1. 百度地图中 使用了c++   设置buidSeting compoileSource 为 Object-C++  强制使用oc++编译器 2. 设置  BuidSeti ...

  8. IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。

    [2015-05-12解决记录] 问题:服务器上的文件一直都是好的,但是运行了很长一段时间以后,发现网站打不开,或者上传不了图片了,怎么办? 错误信息:c:\windows\system32\inet ...

  9. <context:annotation-config> 跟 <context:component-scan>诠释及区别

    <context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注 ...

  10. tomcat与IIS在多IP服务器下的支持

    同一个服务器下,双IP(或更多IP),实现tomcat与IIS公用80端口. 操作其实也很简单的,首先禁用iis的套接字池,iis绑定一个ip,然后tomcat在绑定另一个ip,最后重启下服务器即可. ...