經過GeoIP2分析訪問者IP獲取地理位置信息

MaxMind GeoIP2 服務能識別互聯網用戶的地點位置與其餘特徵,應用普遍,包括個性化定製內容、詐欺檢測、廣告定向、網站流量分析、執行規定、地理目標定位、地理圍欄定位 (geo-fencing)以及數字版權管理。目前使用 GeoIP 更可能是配合Nginx或Apache服務器進行日誌分析獲取網站訪問量地域分佈情況。git

GeoIP 分爲商業版和免費版,免費版比商業版精度差了許多,經測試對於城市定位確實有差距,可否接受看你的精度要求!github

1、免費版本介紹:數據庫

一、GeoLite 版本,網上流傳較廣,數據庫類型爲 dat 格式文件,庫文件較小未進行精準度測試。數組

二、GeoLite2版本,目前最新版本,數據庫文件爲 mmdb 格式文件,有興趣瞭解 mmdb 格式的點這裏 。服務器

二者數據庫文件大小比對,GeoLite2 特性點擊這裏網絡

[plain] view plain copyapp

 在CODE上查看代碼片派生到個人代碼片

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

City 文件爲包含城市信息數據庫,Country 文件爲國家信息數據庫。curl

 

2、下載 GeoLite2 數據庫
下載方式分爲兩種,第一種經過下載 gz 壓縮包,第二種經過使用官方提供的下載更新程序,建議使用第二種,官方稱數據庫在每月的第一個星期二更新,若是想作成計劃任務每個月都更新建議選擇第二種!GeoIP2詳細更新日誌點這裏ide

兩種方式這裏都囉嗦一下,本階段只是講如何下載數據庫,調用方式須要參考第三階段 API 調用部分!測試

一、第一種方式,下載 gz 文件並解壓縮。

GeoLite2 只提供 City 數據庫和 Country 數據庫下載 查看詳情點擊裏,數據庫文件分爲 Binary 和 CVS 兩種,這裏使用 Binary 文件。

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  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  

 

二、第二種方式,需安裝官方下載更新程序 geoipupdate 。

a、到 GitHub下載地址 下載 geoipupdate,目前最新版爲 2.1.0,GitHub 鏈接速度要有耐心,確定能夠下載滴!編譯文件須要 libcurl-devel 包支持,需提早下載安裝。

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  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 文件取消註釋便可!

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

c、執行更新

查看geoipupdate幫助文件,瞭解有哪些參數可使用! -d 參數將文件下載到指定目錄,-v 參數就是顯示下載過程明細信息。

 

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

執行更新命令,下載速度看網絡狀況,本文將文件下載到 /mnt/data/geolite2/目錄 。

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

如何配置計劃任務定時更新 GeoLite2 數據庫請自行解決。

3、安裝 GeoLite2 API 調用程序

官方提供 .NET (C#)、C、Java、Perl、Python、Apache API調用。其餘第三方接口也有,但官方不提供技術支持,詳情點擊這裏

本文使用 C 語言API接口進行調用測試,爲下篇文章Nginx與GeoIP2配合作鋪墊。其餘語言請參考官方指導自行解決!C語言API GitHub 下載地址

 

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  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  

查看幫助文檔

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

4、測試

一、獲取國家信息,國家信息是正確滴,看着像亂碼的地方是顯示的俄語!

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

 

二、獲取城市信息,這個數據就有點糾結了,省份沒有問題,城市是有問題的! 官方演示地址 很是精準,也許這就是免費和收費的差異 :)

 

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  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 內容

 

[plain] view plain copy

 在CODE上查看代碼片派生到個人代碼片

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

 

獲取省份要注意一點,省份是個數組,無心中發現每一個版本的獲取方式還不同,注意版本區別!

 

[plain] view plain copy

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

 

 

雖然 GeoIP2 免費數據庫在城市定位分析的不是很理想,但對我來講精度能夠接受,聊勝於無嘛! 

相關文章
相關標籤/搜索