MaxMindのGeoIP2-phpを使って、アクセス元のIPアドレスから、国や地域を推定するIP ジオロケーションをやってみます。なおGeo IP拡張はDBの更新が終わっているので事実上使えないようです。
環境
- ubuntu 18.04
- PHP 7.4
GeoLite2 データベースの構築
GeoIP2-phpを使ってIPジオロケーションを行うには、GeoLite2データベースが必要になります。ユーザー登録からデータベースの構築まで解説します。
ユーザー登録
登録ページからユーザー登録します。登録するとメールが送られてきますので、記載されているリンクからパスワードを登録します。
ライセンスキーの発行
ログイン後、ライセンスキーの管理ページから「Generate new license key」ボタンを押して、ライセンスキーを発行します。

キーの説明を適当に入力し、ラジオボタンを下の画像の様に選択して「Confirm」ボタンを押すとキーが生成されます。

すると、下図の画面に遷移します。[Download Config]ボタンを押して、コンフィグファイル(GeoIP.conf
)をダウンロードしておきます。
なお、この画面を離れると二度とライセンスキーを確認することはできません(一覧画面には頭4桁しか表示されません)。ただし、ダウンロードしたコンフィグファイルには記載されていますので、改めて控える必要はないです。

GeoIP Updateのインストール
以下のコマンドでインストールします。
$ sudo add-apt-repository ppa:maxmind/ppa
$ sudo apt update
$ sudo apt install geoipupdate
先程ダウンロードしたコンフィグファイルを/etc
下にコピーしておきます。
$ ls /etc/GeoIP.conf
/etc/GeoIP.conf
コンフィグが準備できたら、geoipupdate
を実行して、データベースを構築します。--verbose
オプションを付けて、動きを見ながらの方が良いと思います。
$ sudo geoipupdate --verbose
/usr/share/GeoIP
下にデータベースファイルが作成されていることを確認してください。
$ ls /usr/share/GeoIP/
GeoIP.dat GeoIPv6.dat GeoLite2-ASN.mmdb GeoLite2-City.mmdb GeoLite2-Country.mmdb
なお今回はお試しなので、cronを使って定期的にデータベースを更新することはしません。
GeoIP2-php のインストール
composer叩くだけです。
$ composer require geoip2/geoip2:~2.0
サンプル
試しに使ってみました(tdomy/php-geoip)。
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use GeoIp2\Database\Reader;
if ($argc < 1) {
print("ERROR: This script requires target IP address as argument.\n");
exit(1);
}
$reader = new Reader('/usr/share/GeoIP/GeoLite2-City.mmdb');
$target_ip_address = $argv[1];
$record = $reader->city($target_ip_address);
printf(
"IP Address\t%s\nCode\t%s\nName\t%s\n",
$target_ip_address,
$record->country->isoCode,
$record->country->name,
);
実行すると以下のようになります。
$ php bin/city.php `curl -s inet-ip.info`
IP Address 147.192.70.222
Code JP
Name Japan