こんにちは、鯨井貴博@opensourcetechです。
今回は、NginxのGeoIPモジュールを使って、
ログにクライアントのアクセス元IPアドレスから国名などの情報を記載してみます。
なお、OSとしては、CentOS6.6の64ビット版を使用しています。
使用するモジュールはGeoIPとなり、
コンパイル時に「--with-http_geoip_module」を指定する必要があります。
まずは、/tmpにnginxのtarballをダウンロードします。
cd /tmp
wget http://nginx.org/download/nginx-1.7.10.tar.gz
tarballをtarで解凍します。
tar zxvf nginx-1.7.10.tar.gz
続いてNginxの依存関係にあるパッケージをインストールします。
yum install zlib-devel gcc openssl openssl-devel pcre-devel
そして、GeoIPモジュールを追加してconfigureスクリプトを実施します。
cd //tmp/nginx-1.7.10
./configure --with-http_geoip_module
しかし、GeoIP libraryが「not found」となり、
configure errorとなってしまいました。
なので、GeoIP libraryをインストールします。
GeoIP libraryのインストールには、
通常のレポジトリからではなくEpelなど別のレポジトリから行う必要があります。
cd /tmp
wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpmでダウンロードしたパッケージをインストールすると、
/etc/yum.repos.d配下にepel.repoなどのファイルが追加されます。
その内容は、以下のスクリーンショットのようになっています。
これでGeoIP libraryが入るはず!
yum install GeoIP GeoIP-devel
改めてconfigureスクリプトを実施します。
cd /tmp/nginx-1.7.10
./configure --with-http_geoip_module
今度は無事に成功です!
あとは、make と make installします。
make
make install
デフォルトの場合、
Nginxの実行ファイルが/usr/local/nginx/sbin配下にあるので、
インストール確認を行います。
/usr/local/nginx/sbin -v
/usr/local/nginx/sbin -V
GeoIPモジュールでは、
別途MAX MINDが提供しているデータベースが必要となりますので、
サイトよりダウンロードします。
GeoLite Legacy Downloadable Databases « Maxmind Developer Site
以下の赤で囲んだものが今回しようしたデータベースです。
cd /usr/local/nginx/conf
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gzip形式で圧縮されているので、gunzipなどで解凍します。
gunzip GeoIP.dat.gz
gunzip GeoLiteCity.dat.gz
続いては、nginxの設定を行います。
設定ファイルは、/usr/local/nginx/conf内にあるnginx.confとなります。
そのhttpブロック内に、以下を追記します。
geoip_country /usr/local/nginx/conf/GeoIP.dat;
geoip_city /usr/local/nginx/conf/GeoLiteCity.dat;
また、GeoIPモジュールを使用した場合、
以下の変数が使用可能になります。
※各変数の詳細は、Module ngx_http_geoip_moduleで確認出来ます。
-------
$geoip_area_code
$geoip_city
$geoip_city_continent_code
$geoip_city_country_code
$geoip_city_country_code3
$geoip_city_country_name
$geoip_country_code
$geoip_country_code3
$geoip_country_name
$geoip_dma_code
$geoip_latitude
$geoip_longitude
$geoip_org
$geoip_postal_code
$geoip_region
$geoip_region_name
なので、それらを使用するよういlog_formatを編集します。
log_format geoip '["$date_gmt"] ["$geoip_area_code" "$geoip_city" "$geoip_city_continent_code" "$geoip_city_country_code" "$geoip_city_country_code3" "$geoip_city_country_name" "$geoip_country_code" "$geoip_country_code3" "$geoip_country_name" "$geoip_dma_code" "$geoip_latitude" "$geoip_longitude" "$geoip_org" "$geoip_postal_code" "$geoip_region" "$geoip_region_name"] ["$remote_addr" "$remote_port" "$request"} ["$server_name" "$server_port" "$server_protocol"]';
また、アクセスログの記録様式に上記を指定します。
access_log logs/access.log geoip;
これで設定は完了です。
nginxの起動/起動確認
/usr/local/nginx/sbin/nginx
netstat -tan | grep 80
ps aux | grep nginx
FW(iptables)の解放
iptables -L --line-numbers
iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
iptables -L --line-numbers
(iptables-save > /etc/sysconfig/iptablesもやっておくといいでしょう)
上記まで出来た状態でクライアントからNginxへアクセスをすると、
以下のように/usr/local/nginx/logs/access.logに GeoIPモジュールによる情報が記録されるようになります。
tail -f /usr/local/nginx/logs/access.log