WordPressのプラグインSlimstatで国が表示されない

いつからかSlimstat AnalyticsのReal-timeで国が表示されなくなった。確かに警告されていたような気がしたんだけれど、動作をちゃんと理解していなくて、無視していたらそんなことに。





どうやらIPアドレスから地域を割り出すために使われるデータベースが古すぎて、Slimstat側でデータベースを削除してしまった模様。警告はそれを意味していたのか…
WordPress Support / MaxMind Geolocation not working

やること。

 

準備

基礎知識

Slimstatはページにアクセスされると、その段階で色々な情報を分析してデータベースに保管しているらしい。

具体的には…「Country」とか「City」は、アクセスされたときにローカルに保存してあるGeoIP2(有料)、またはGeoLite2(無料)というデータベースから情報を引っ張り出して保管している。なので、後からデータベースを配置しても「Country」や「City」は表示されない。

データベースは <WordpressHome>/wp-content/uploads/wp-slimstat/maxmind.mmdb に配置してあるものを使う(リネームして配置)。

GeoIP2やGeoLite2は毎週火曜日に更新される。
MAXMIND Support Center / How often are the GeoIP2 and GeoLite2 databases updated?

ローカルに保存してあるデータベースが古いと、Slimstatは間違った「Country」や「City」を保存していくことになるので、データベースが古すぎると検知したらファイルを削除して機能させなくするのは自然の成り行きなのだ。

アカウントの作成

MAXMINDにサインアップすると無料のGeoLite2データベースがダウンロードできるアカウントが作られる。
MAXMIND / GeoLite2 Free Downloadable Databases

サインアップ自体は無料、有料の何かを使いたいときにはライセンスを購入する形式になっている模様(支払い方法を登録してからじゃないと表示されない?気が付いたら買っちゃいましたっていうようなリンクはなさそう)。

有料版と無料版の違い

GeoIP2とGioLite2の違いはここに。
Y-Ken Studio / 有料版GeoIP Cityの料金体系や、無料版GeoLite Cityとの精度の違いについて調べてみた

現在の精度についてはここで調べてみることができる。
MAXMIND / GeoIP2 City Accuracy
「Enter Country」という箱にJapanと入力し、例えば「Broadband IPs」を選択し、範囲を選択する…とどの程度の精度なのかが表示される。「Cellular IPs」の精度が低いのは、広い範囲で使われるIPアドレスがあるからだろう。

でも…これは精度が100%になることなんてないんだよな、と思う。ProxyやVPNを使っていたりすれば、ぱっと見はその出口1点になる訳だから。

Ubuntuで用意されているパッケージ

ここにあったgeoipupdateというコマンドを検索してみたら、2つのコマンドが見つかった。
MAXMIND / Automatic Updates for GeoIP2 and GeoIP Legacy DAtabases

geoipupdate

公式にあったスクリプトがそのままパッケージになっている模様。2013年の表記。
ubuntu manuals / geoipupdate
ubuntu packages / geoipupdate(2.5.0-1) [multiverse]

update-geoip-database

これも公式にあったものなんだろうと思われる。2010年の表記。
ubuntu manuals / update-geoip-database
ubuntu packages / geoip-database-contrib(1.19) [multiverse]

パッケージの中を見ると、どうやらこれは、古いフォーマット(dat形式)らしい。
Slimstatは新しいフォーマット(mmdb形式)を求めているので、今回は対象外となる。

ダウンロードの自動化

MAXMINDのアカウントがあれば、ログインしてGeoLite2データベースをダウンロードすることができるので、時々ダウンロードして配置すれば良いのだけれど、面倒なので自動化したい。

匿名でのダウンロードはできなかったので、ライセンスキー(無料)を発行し、ダウンロード用のコマンドでダウンロードする。

ライセンスキーの準備

MAXMINDにログインし、ライセンスキーを作成する。

ログインしたらServices – My License Keyをクリックする。
何もライセンスが作られていない状態。

Generate new license keyをクリックして必要情報を入力。

Ubuntu18.04のパッケージに含まれているgeoipupdateコマンドはバージョンが2.5.0なので、古いバージョン用のキーを生成する。ただ、キーがハッシュされないと書かれている。

必要情報を入力してConfirmをクリックするとライセンスキーが生成される。

生成されたライセンスキーを書き留めておく。
Download Configをクリックすれば、そのまま使える設定ファイルがダウンロードできる。

インストールと設定

GeoLite2のダウンロードにはgeoipupdateを使う。

$ sudo apt install geoipupdate
$ geoipupdate -V
geoipupdate 2.5.0

※現在の最新は4.xらしいので、だいぶ古い…。

設定ファイルは元々ある項目のままだとエラーになるので、ダウンロードしたファイルをベースに以下の通り修正。
/etc/GetIP.conf
#AccountID 0 ← この指定だとエラーになる
#LicenseKey 000000000000
#EditionIDs GeoLite2-Country GeoLite2-City

UserId nnnnnn
LicenseKey nnnnnnnnnnnn
ProductIds GeoLite2-City

Slimstatで使おうとしているのが「City」なのでGeoLite2-Cityだけを指定しているが、ASN、Countryも一緒に指定できる。

ダウンロードのテスト

ダウンロードしてみる。

$ sudo geoipupdate -v

※小文字のvをパラメーターに付けると、動きを細かく知らせてくれる。

最初、Invalid account IDのエラーが発生したが、ダウンロードしたGeoIP.confの中身を見て手直ししたところ、正常に動き出した。

ファイルは/var/lib/GioIP/GeoLite2-City.mmdbとして保管される。圧縮されていないので、そのまま使える。

ダウンロードスクリプト

GeoLite2をダウンロードしてきてSlimstatが要求するディレクトリにファイルを置く。
例によって恥ずかしいスクリプトだけれども、自分用メモとして記載。

geoipupdateはファイルが更新されていなければファイルをダウンロードしてこない。
ファイルをダウンロードしてもしなくても、戻り値は0。ライセンスエラー等が発生した場合には0以外が戻される。
でも、これだと、ファイルが更新されたのかどうか分からない。

そのため、i-node番号が変わったら新しいファイルに置き換えられたと判断することにした。
iノードはlogcheckを設置するときに学習していたので、これを活用。

update_giolite2
#!/bin/bash
GEOIP_PATHNAME=/var/lib/GeoIP/GeoLite2-City.mmdb
GEOIP_PATHWORK=/var/lib/GeoIP/maxmind.mmdb
GEOIP_SLIMSTAT=/usr/share/wordpress/wp-content/uploads/wp-slimstat/maxmind.mmdb

if [ -f $GEOIP_PATHNAME ]; then
    GEOIP_WORK=`ls -i $GEOIP_PATHNAME`
    GEOIP_INODE=${GEOIP_WORK% *}
else
    GEOIP_INODE=0
fi

geoipupdate

if [ $? = 0 ]; then
    GEOIP_WORK=`ls -i $GEOIP_PATHNAME`
    GEOIP_CHECK=${GEOIP_WORK% *}
fi


if [ $GEOIP_INODE != $GEOIP_CHECK ]; then
    cp -a $GEOIP_PATHNAME $GEOIP_PATHWORK
    chown www-data:www-data $GEOIP_PATHWORK
    mv $GEOIP_PATHWORK $GEOIP_SLIMSTAT
    echo "GeoLite2: Updated."
else
    echo "GeoLite2: No new updates available."
fi

これをcronに登録。水曜日にでも更新しようかと思う。

さいごに

GeoLite2の情報を提供して頂き、ありがとうございます。
当サイトではアクセス元の大まかな地域がふんわり分かれば十分。もっと商売っ気があれば色々と詳細な分析をしたくなるのかもしれないが、今は提供されているの精度で十分すぎるというのが率直な感想。


ところで、昨日から生産性が気になり始めた。今回のことについてストレートに「こうですよ」と教えてくれたところはなかったけれど、このくらいのことはサクッと終わらせたい。

何で生産性が低いのかを考えてみると、メモを書いているからではないような。部分的には「こうですよ」と教えてくれているのに、念のためと称してマニュアルを探しに行ったりしてる。
それに、頭の中で全体構想を練り直していることも多く、その都度文章を書き直したりもしている。

ざくざく書いて、後から構成し直すやり方に変えてみようかな。

それと、bashの知識が足らなすぎるな。どこかで整理し直す必要があるだろうな、これ。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です