Nginxには、geo ディレクティブというものがあります。
これは、クライアントのIPアドレスから、何かしら判断した結果を変数として格納することができます。
ここでは、このIPアドレスから国を求めたいと思います。
ついでに、同じgeo ディレクティブを使って携帯キャリアを判定して携帯サイトへ転送させてみるのを、おまけでやってみます。
- 目次
- 履歴
2013年3月9日 初版
nginx でgeo ディレクティブ を使ってみる
先に書いたように、geoディレクティブでIPアドレスを判断することができます。
そのgeoディレクティブについて、簡単に解説しておきます。
geoディレクティブとは
- 概要
このディレクティブは、指定された変数へ クライアントのIPアドレスの依存性(判断結果)を設定します。
デフォルトでは、ここで使用されるIPアドレスは$remote_addrですが、バージョン0.7.27以降、それは別の変数を指定することも可能です。
無効なIPアドレスの場合には、値255.255.255.255が使用されていることに注意してください。
また、このディレクティブは、Coreモジュールに含まれているので、特にインストールなどの作業は必要ありません。
- 形式 : geo [ $address ] $variable { … }
$address : 判断に使用するIPアドレスの変数を指定します。省略可で、デフォルト $remote_addr を使用します。
$variable : 判断結果を格納する変数名を指定します。
{ … } : 判断するIPアドレスと一致した場合に格納するデータをペアで指定します。
- 使えるディレクティブの範囲
このディレクティブは、以下のディレクティブ内で使用できます。
- http
- 使い方
以下のように使うことができます。
... http { ... geo $geo { 192.168.0.100 NG; default OK; } ... server { listen 80; server_name example.com; ... if ($geo = 'NG') { return 403; } ... } ... } ...
この例では、http://example.com/ へアクセスしたクライアントの中で、IPアドレスが 192.168.0.100 だった場合、すべて 403 Forbidden(閲覧禁止) としています。
geoディレクティブを使ってクライアントの国を判断する
以下の手順で、geoディレクティブを使ってクライアントの国を判断します。
- Maxmind のサイトから GeoLite Country CSV ファイルをダウンロードします。
Maxmind のサイトでは、無料で使用できる国別IPアドレスのデータファイル(バイナリファイルとCSVファイル)が公開されています。 ここでは、テキストファイルとして使用したいのでCSVファイルをダウンロードします。
# Maxmind のサイトから GeoLite Country CSV ファイルをダウンロードします。 $ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip ... # unzipコマンドで解凍します。 $ unzip GeoIPCountryCSV.zip ... # ファイルの確認をします。GeoIPCountryWhois.csv が国別IPアドレスのデータファイルになります。 $ ls GeoIPCountryCSV.zip GeoIPCountryWhois.csv
- GeoLite Country CSV ファイルをnginxのgeoディレクティブで使えるように編集します。
GeoLite Country CSV ファイルは、そのままCSV形式のファイルなので、そのままgeoディレクティブで使えません。
そこで、GeoLite Country CSV ファイルをnginxのgeoディレクティブで使えるように編集します。
その際、perlスクリプトで書かれたツールがありますので、それを使います。
# nginx のサイトから GeoLite Country CSV ファイルを変換するperlスクリプトをダウンロードします。 $ wget http://trac.nginx.org/nginx/export/5107/nginx/trunk/contrib/geo2nginx.pl ... # perlスクリプト geo2nginx.pl を使って、CSVファイルを変換します。 $ perl geo2nginx.pl < GeoIPCountryWhois.csv > geocountry.conf ... # ファイルの確認をします。geocountry.conf が国別IPアドレスのnginx用データファイルになります。 $ ls GeoIPCountryCSV.zip GeoIPCountryWhois.csv geo2nginx.pl geocountry.conf
- geocountry.conf をgeoディレクティブに組み込みます。
先に作成した nginx用の国別IPアドレスデータファイルを、nginxの設定ファイル ( /etc/nginx/nginx.conf )に組み込みます。
# geocountry.conf を nginx の設定ファイルと同じディレクトリへ移動します。 $ mv geocountry.conf /etc/nginx/.
nginxの設定ファイル ( /etc/nginx/nginx.conf )を編集します。
... http { ... geo $geo { include geocountry.conf; default NG; } ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ' $geo'; ... server { listen 80; server_name example.com; ... if ($geo != 'JP') { return 403; } ... } ... } ...
ポイントは、
include geocountry.conf;
です。
先に変換した geocountry.conf をgeoディレクティブで読み込むことで、$geo 変数に国の種別が設定されます。
上記の例では、’JP’ 日本以外は、すべて403 Forbidden(閲覧禁止) としています。
ついでに確認用としてログフォーマットに $geo を常に出力するようにしています。
編集を終えたら、nginxの再読み込み、あるいは再起動します。$ /etc/init.d/nginx reload
- 最後に動作確認です。
ローカルIPアドレスの 192.168.0.100 などから、アクセスしてみてください。以下のように 403 Forbidden が出力されるはずです。
また、アクセスログには、以下のように出力されているはずです。
... 192.168.0.100 - - [08/Mar/2013:17:27:53 +0900] "GET / HTTP/1.1" 403 168 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0" "-" NG ...
geoディレクティブを使ってクライアントの携帯キャリアを判断して携帯サイトへ転送してみる (おまけ)
上記と同じようなやり方で、geoディレクティブを使ってクライアントの携帯キャリアを判断することもできます。
各携帯キャリアが使用しているIPアドレスは、以下のページで公開されています。
- Docomo → http://www.nttdocomo.co.jp/service/developer/smart_phone/technical_info/etc/index.html
- au(KDDI) → http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
- SoftBank → http://creation.mb.softbank.jp/mc/tech/tech_web/web_ipaddress.html
- Willcom → http://www.willcom-inc.com/ja/service/contents_service/create/center_info/index.html
この情報を単純にまとめてあげればできるはずですね。
とりあえず、ファイル名を /etc/nginx/carrierip.conf で作成しておきます。
|
あとは、国を判定した時と同じように、nginx設定ファイル ( /etc/nginx/nginx.conf )を編集します。
|
ポイントは、
include carrierip.conf;
です。
上記の例では、’PC’ (つまりは、携帯キャリアからでない場合)のみを受け付け、携帯キャリアは、携帯用ディレクトリ(ここではディレクトリ転送にしていますが、URL転送でもOK)へ転送しています。
ついでに確認用としてログフォーマットに $geo を常に出力するようにしています。
編集を終えたら、nginxの再読み込み、あるいは再起動します。
|
同じgeoディレクティブを使ったものでも、いろんな用途があるのがご理解いただけたのではないでしょうか。
geo というと住所的な情報かなぁと思いがちですが、結局、IPアドレスで判断できることは、geoディレクティブでやってしまうことができるんですね。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :