レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Nginx でIPアドレスを使って国を判断する(geo を使ってみる)、おまけで携帯キャリアを判定して携帯サイトへ転送させてみる

2013年3月9日 2015年5月15日
nginx geo

Nginxには、geo ディレクティブというものがあります。
これは、クライアントのIPアドレスから、何かしら判断した結果を変数として格納することができます。

ここでは、このIPアドレスから国を求めたいと思います。
ついでに、同じgeo ディレクティブを使って携帯キャリアを判定して携帯サイトへ転送させてみるのを、おまけでやってみます。

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ディレクティブを使ってクライアントの国を判断します。

  1. 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

  2. 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

  3. 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

  4. 最後に動作確認です。

    ローカルIPアドレスの 192.168.0.100 などから、アクセスしてみてください。以下のように 403 Forbidden が出力されるはずです。

    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アドレスは、以下のページで公開されています。

この情報を単純にまとめてあげればできるはずですね。
とりあえず、ファイル名を /etc/nginx/carrierip.conf で作成しておきます。

# Docomo
1.66.96.0/21	docomo
1.66.104.0/23	docomo
...
# au(KDDI)
111.107.116.64/26	kddi
111.107.116.192/28	kddi
...
# SoftBank
123.108.237.112/28	softbank
123.108.239.224/28	softbank
...
# Willcom
61.198.129.0/24	willcom
61.198.130.0/24	willcom
...
上記の carrierip.conf のイメージは、こちら からダウンロードできます。あくまでのサンプルですので、自己責任にてご利用ください。

あとは、国を判定した時と同じように、nginx設定ファイル ( /etc/nginx/nginx.conf )を編集します。

...
http {
    ...
    geo  $geo {
        include  carrierip.conf;
        default  PC;
    }
    ...
    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 != 'PC') {
             rewrite  ^(.*)$  /mobile/$1  break;
        }
        ...
    }
    ...
}
...

ポイントは、
include carrierip.conf;
です。

上記の例では、’PC’ (つまりは、携帯キャリアからでない場合)のみを受け付け、携帯キャリアは、携帯用ディレクトリ(ここではディレクトリ転送にしていますが、URL転送でもOK)へ転送しています。

ついでに確認用としてログフォーマットに $geo を常に出力するようにしています。

編集を終えたら、nginxの再読み込み、あるいは再起動します。

$ /etc/init.d/nginx reload


いかがだったでしょうか?
同じgeoディレクティブを使ったものでも、いろんな用途があるのがご理解いただけたのではないでしょうか。
geo というと住所的な情報かなぁと思いがちですが、結局、IPアドレスで判断できることは、geoディレクティブでやってしまうことができるんですね。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

CentOS 7 でLAMP(Nginx+MariaDB(MySQL)+PHP)インストールからWordPressを動かすまで(Nginx編)

今回は、CentOS,ScientificLinuxでLAMP(Nginx+MySQL+PHP)インストールからWordPressを ...

CentOS,ScientificLinuxでLAMP(Nginx+MySQL+PHP)インストールからWordPressを動かすまで(Nginx編)

今回は、最短でLAMPインストールし、Wordpressを動かすまでの手順について解説してみたいと思います。 とりあえず、CentOS / S ...

Nginx で Wordpress を使う時の注意点

Nginx 上で WordPress を動作される場合、いろいろな注意点があります。 今回は、その注意点について、簡単に解説してみたいと思いま ...

Nginx をリバースプロキシ(キャッシュ) として使ってみた

前回「Nginx + php-fpm をさくらのVPSで使ってみた」では、 nginxをウェブサーバーとして使ってみました。実際に ...

Debian(Ubuntu 12) で Dotdeb から最新のnginx をインストール、php-fprm を使ってphpを動かしてみる

Debian (Ubuntu 12) で Dotdeb から最新のPHP , MySQL をインストールする の続きで、今回は、最新のnginx ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2953 [s]