サイトアクセス者の位置情報を取得するGeoIP

 ポータルやeコマースなどアクセス数の多いWebサイトを管理している人なら、アクセス者の地理的な位置を特定できればありがたいと思うだろう。位置情報は、コンテンツのローカライズ、関連する地域広告の表示、近くのダウンロードミラーの提供、オンライン詐欺の検出に役立てることができる。whoisのようなIPアドレス検索の手法もいくらか役に立つが、常に正確な位置が得られるとは限らない。もっとよい方法が、MaxMindのGeoIPのようなIPアドレスを位置情報にマッピングしたデータベースを使うことだ。

 GeoIPとは、IPアドレスを国、都市、インターネットサービスプロバイダ(ISP)にマッピングしたデータベース群である。そうしたデータとともにC、PHP、Javaその他いくつかの言語を使ってデータベースにアクセスするためのLGPLライセンスのAPIも用意されている。MaxMindは、GeoIPのライト版をOpen Data Licenseの下でリリースし、追加ソースからの情報によって拡充したものを商用ライセンスの下で提供している。

 GeoIPには、GeoIP CountryGeoIP Cityという2種類のデータベースがある。フリーのライト版は、MaxMindからCSVファイルまたはバイナリファイルとしてダウンロードできる。データへのアクセスに複雑な要件があってカスタムルーチンを必要とする場合は、CSVファイルが便利だ。そうでなければ、MaxMindのAPIですぐに使えるバイナリのデータベースファイルがよいだろう。また、MaxMindはApache用の動的共有モジュールmod_geoipも提供しており、これを使えば位置情報データベースに問い合わせてアクセス者の位置を特定することができる。

 mod_geoipは、RPMファイルからのインストール、またはソースからのコンパイルが可能だ。ただし、mod_geoipをコンパイルするには、GeoIPのC言語用APIをインストールする必要がある。このC言語のAPIには、バイナリ形式の国情報データベースファイルが付随している。mod_geoipのソースアーカイブをコンパイルし、この共有モジュールをインストールするには、次のapxsコマンドを使用する。

apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c

 共有モジュールをインストールしたら、Apacheにロードして有効にするために、以下の行をApacheの設定ファイル/etc/httpd/conf/httpd.confか、モジュール固有の設定ファイル/etc/httpd/conf.d/mod_geoip.confに追加する必要がある。

LoadModule geoip_module modules/mod_geoip.so
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/local/share/GeoIP/GeoIPCountry.dat
</IfModule>

 Apacheの設定を変更した後は、「/etc/rc.d/init.d/httpd reload」コマンドを使ってリロードを行う。

 デフォルトでは、Apacheでmod_geoipを有効にすると、2つの環境変数とnotesテーブルのエントリ、GEOIP_COUNTRY_CODEとGEOIP_COUNTRY_NAMEが設定される。これらの変数やnotesテーブルのエントリは、mod_rewriteのような他のモジュールの設定ディレクティブで使用できる。そのため、以下のコードを/etc/httpd/conf/httpd.confまたは/etc/httpd/conf.d/mod_geoip.confに追加することにより、ロシアからのアクセス者をロシア語サイト上の対応ページにリダイレクトするといったことが可能になる。

RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^RU$
RewriteRule ^(.*)$ http://ru.example.com$1 [R,L]

 Apacheの設定を使うことでリダイレクトなど簡単なタスクを実行することはできるが、GeoIPに基づくもっと複雑な処理をPHPや別の言語で書かれたWebアプリケーションコードの内部で行えたほうがよいだろう。たとえば、PHPコードで国別の広告を提供するために、アクセス者の国コードを広告表示スクリプトのURLに含めることができる。

$visitor_country_code = $_SERVER["GEOIP_COUNTRY_CODE"];
$advertisement_url = "/path/to/advertisement_script.php?targetCountryCode=$visitor_country_code";

PHP用のライブラリ

 位置情報の検索にApacheを使用するという前述のアプローチはパフォーマンス面で優れているが、共有ホスティングの設定があるならPHPのみの方法のほうが実現はずっと容易になる。geoip.incというGeoIP用のPHPライブラリを使えば、Apacheに頼ることなくPHP内部からGeoIPデータベースに簡単にアクセスできるのだ。

 このライブラリは、geoip.incファイルをPHPのinclude_pathのどこかに含めることでインストールできる。同ライブラリには、GeoIPというクラスとGeoIPオブジェクトを利用するための一連の機能が用意されている。たとえば、PHPスクリプトに次のコードを追加すると、アクセス者の国名を表示できる。

include("geoip.inc");
$gi = geoip_open("/usr/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
$visitor_ip_address = $_SERVER["REMOTE_ADDR"];
$visitor_country_name = geoip_country_name_by_addr($gi, $visitor_ip_address);
echo $visitor_country_name;

 もう1つの方法は、PHPエクステンションGeoIP PECLモジュールを使って位置情報検索機能をPHPに追加することだ。

ISPとプロキシを深読みする

 AOLのように複数の国々でサービスを提供しているISPでは、トラフィックのルーティング方法ゆえに位置情報ソフトウェアに対する困難が伴う。GeoIPデータベースの商用版では、特にこうしたISPの場合に位置情報の特定についての改善が見込まれる。商用版のGeoIP Cityは、データベース内の追加ソースからの提供データを含めることで、より精度の高いマッピングを試みている。なお、軽量版と商用版のどちらにも、都市、緯度、経度、地域、郵便の各コードのような位置関連の情報が用意されている。

 ときには、オープンな匿名プロキシサーバを利用してHTTP要求のルーティングを行うことで、ユーザが実際の居場所をマスキングしたり、ローカルアクセスの制限を回避したりすることもあり得る。こうした場合は、ユーザの位置情報が誤って特定される可能性がある。GeoIPのプロキシ検出では、その接続が公開されている既知の匿名プロキシサーバからのものかどうかを確認することで、この問題を解決している。MaxMindが提供するその他の関連ツールとして、特定のIPアドレスを使用している組織を探し出すGeoIP Organization、アクセス者の利用しているISPを特定するGeo IP ISP、アクセス者のインターネット接続速度に関する情報を取得するGeoIP Netspeedがある。

 サイトにアクセスしてくる人の位置情報は、Webコンテンツのカスタマイズやトラフィック解析の精度向上に役立つ。Geo IPのデータベースとAPIがオープンソースライセンスの下で利用できることで、Webのジオロケーション(地理位置情報)技術の可能性はさらに広がっている。

Murthy RajuはインドのRishi Valley Schoolでコンピュータ・サイエンスを教えるかたわら、Linuxコンピュータの小規模なネットワーク管理も行っている。システムやネットワークの管理、Linux、Unix、Windowsの各プラットフォームのオープンソースおよび商用の各種プロダクトの技術サポートに7年間従事した経験を持つ。

Linux.com 原文