序章
Nginxは、クライアント接続を処理してコンテンツを提供するために、いくつかの最大のサイトで利用されている強力なプロキシおよびWebサーバーです。 ほとんどのユーザーはNginxの基本機能に精通していますが、通常の使用法ではすぐにはわからない可能性のある他の機能もあります。
このガイドでは、新しいコンテンツのテストとユーザーに関する統計の収集に役立つ一連の機能について説明します。 これらは、コンテンツ開発の目的、単純なA / Bテストの実行、およびサイトに頻繁にアクセスするさまざまなユーザーグループの動作を知るために非常に役立ちます。 Nginxには、これらの機能をWebサーバー自体に簡単に組み込む機能があります。
スプリットクライアントモジュールを使用したシンプルなA/Bテスト
まず、Nginx自体を使用して基本的なA/Bテストを構成する方法を説明します。 これは、http_split_clients
と呼ばれる標準のHTTPモジュールを使用して実行できます。 カスタムコンパイル中に明示的に無効にされていない限り、これは標準のNginxインストールで利用できるはずです。
このモジュールは、当然のことながら、split_clients
と呼ばれる単一のディレクティブを提供します。これは、構成された要件に基づいて接続要求を2つ以上のカテゴリーに分割します。 このディレクティブは、サーバーブロックの外部のhttp
コンテキストで定義されます。 各接続でチェックする値を指定し、結果を格納する変数を作成します。
ディレクティブの基本的な構文は次のようになります。
http {
. . .
split_clients "variable_to_evaluate" $new_variable {
percent_group% value_to_store;
percent_group% value_to_store;
}
}
ディレクティブは、渡された最初の変数の値を補間し、結果をハッシュすることによって機能します。 同じ値は常に同じハッシュを生成し、一貫した結果を可能にします。 チェックされる変数は、評価時に文字列を生成する必要があります。
split_clients
ブロック内の線は、利用可能なハッシュスペースの消費割合によって定義されるさまざまな「バケット」または代替を表します。 これにより、提供されたパーセンテージによって決定される特定の数のハッシュに一致するハッシュ「範囲」が作成されます。 これらはそれぞれ、ハッシュがそのバケットの範囲内にあるときに設定する必要がある値を定義します。 split_clients
定義中に指定された2番目の変数は、この値に設定されます。
例を考えると、これははるかに理解しやすいです。 次のブロックを見てください。
split_clients "${remote_addr}" $designtest {
10% ".first";
10% ".second";
* "";
}
上記の例では、$remote_addr
の接続値を評価しています。これは、NginxによってクライアントのIPアドレスに設定されます。 クライアントのIPアドレスの値は、murmurhash2ハッシュアルゴリズムを使用してハッシュされます。 この時点で、Nginxは計算されたハッシュがどの範囲のハッシュに含まれるかをチェックします。 Nginxが採用するmurmurhash2の実装は32ビットを使用するため、ハッシュは0〜4294967295(最大の32ビット数)になります。
定義された最初のグループは合計ハッシュの10% ofを指定するため、これは0から429496729に一致します。これは、使用可能な範囲の最初の10分の1です。 この範囲内のハッシュを生成する値は、$designtest
変数を「.first」の値に設定します。
ハッシュがおよそ429496730から858993459のIPアドレス(次の10 % o fの使用可能なハッシュで表されるハッシュ範囲)は、2行目に一致します。 このような場合、$designtest
変数は「.second」に設定されます。
他のすべてのIPアドレスハッシュ(おおよそ858993460から4294967295)の場合、$designtest
変数は空の文字列に設定されます。
これをサーバーに実装する方法
これにより、基本的に、特定の割合の接続をさまざまな変数値にランダムにマッピングできます。 これが完了すると、その変数を使用してさまざまなコンテンツを提供できます。
たとえば、$designtest
変数の値に応じて異なるコンテンツを提供するサーバーとロケーションブロックを追加できます。 以下の例では、この変数を使用して、提供するインデックスファイルを決定します。
http {
. . .
split_clients "${remote_addr}" $designtest {
10% ".first";
10% ".second";
* "";
}
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index${designtest}.html;
location / {
try_files $uri $uri/ =404;
}
}
}
最初のグループに分類されるハッシュを持つIPアドレスの場合、Nginxはindex.first.html
というファイルを提供しようとします。 同様に、2番目のグループに分類されるIPアドレスの場合、Nginxはindex.second.html
というファイルを探します。 IPアドレスが3番目のグループにある場合、$designtest
変数は空の文字列に設定されるため、従来のindex.html
ファイルが提供されます。
ここで、ドキュメントルートに3つのインデックスファイルを作成すると、IPアドレスの結果のハッシュに応じて、これらはさまざまなユーザーに提供されます。
echo "<h1>First Site</h1>" | sudo tee /usr/share/nginx/html/index.first.html
echo "<h1>Second Site</h1>" | sudo tee /usr/share/nginx/html/index.second.html
echo "<h1>Default Site</h1>" | sudo tee /usr/share/nginx/html/index.html
Nginx構成に上記の変更を加えて、Webサーバーを再起動すると、これをテストできます。 構成ファイルに構文エラーがないことを確認してから、次のように入力してサービスを再起動します。
sudo nginx -t
sudo service nginx restart
ブラウザでサイトにアクセスすると、上記の3つのファイルのいずれかが表示されます。 80 % o fのサイト訪問者に提供されるため、これが最後になる可能性があります。 他のユーザーにどのように表示されるかを確認したい場合は、プロキシサーバーまたはいくつかのWebツールを使用してサイトにアクセスできます。
たとえば、 GeoPeeker サイトを使用して、世界中のさまざまな場所からサイトを表示できます。 ドメイン名を入力すると、代替サイトの少なくとも1つが表示される場合があります。
もう1つの同様のサイトはLocaBrowserで、さまざまな国から選択できます。 提供されるページの分割は地理的位置に基づくのではなく、IPアドレスのハッシュに基づくため、1つの国からのすべての訪問者に同じファイルが提供されるわけではないことに注意してください。
上記の例は単純な例ですが、概念はかなり拡張できます。 split_clients
ディレクティブで設定された変数を使用して、CookieとユーザーIDを設定したり、ヘッダーをバックエンドプロキシに渡したりすることができます。 より完全にA/Bテストを行う場合は、設定した変数を使用して、さまざまな関係者に提供されているドキュメントルートを決定することをお勧めします。
${remote_addr}
チェックは単なる便利な例であることを覚えておくことも重要です。 文字列で機能するNginxの変数の値に基づいてハッシュできます。 コアモジュールここに含まれているもののリストを見つけることができますが、他の変数は他のモジュールから利用できます。 詳細については、ドキュメントを確認してください。
empty_gifディレクティブを使用したトラッキングピクセルの設定
管理者が自分のサイトにアクセスするユーザーを説明しようとする1つの方法は、ピクセルを追跡することです。 ピクセルの追跡は、管理者が簡単なログ記録を通じて、どのIPアドレスがどのページにいつアクセスしているかに関するデータを収集するための良性の方法です。
従来のトラッキングピクセルが機能する方法は、ページに小さな透明な画像を埋め込むことです。 ユーザーがサイトにアクセスすると、ページを読み込むプロセスの一部として画像が要求されます。 管理者は、これらの要求を、要求の送信元のIPアドレス、要求を行ったときにクライアントがロードしていたページなどとともに、別のログに記録できます。 このタイプの情報は、Webサイトでの訪問者のアクションに関するデータ分析の基礎になります。
empty_gif
モジュールは、Nginx内でこの機能を提供します。 追跡には任意のリクエストを使用できますが、empty_gif
ディレクティブを使用すると、メモリに存在する小さな透過的な.gif
ファイルを提供し、ディスクアクセスを回避できます。 これにより、このリソースのリクエストが高速化されます。 ディレクティブは、任意の場所のコンテキストで有効です。
ほとんどの場合、このディレクティブは、後で分析するために要求を分離するために、別個のログディレクティブと組み合わせて使用されます。 たとえば、構成には次のようなセクションを含めることができます。
. . .
http {
log_format tracking '[$time_local] : $remote_addr : $remote_user : '
'$args : $http_referer : $http_user_agent';
server {
. . .
location = /logme.gif {
empty_gif;
access_log /var/log/nginx/tracking.log tracking;
expires epoch;
}
}
}
ここでは、http
コンテキストでlog_format
を設定して、追跡したい情報を記録します。 これはあなたが好きなものにすることができます。
その後、特定の.gif
リクエストに一致するようにロケーションブロックを設定できます。 =
修飾子を使用しているため、.gif
のリクエストは、他の場所でより適切な一致を検索することなく、迅速かつ効率的に一致します。 .gif
の名前は任意に選択できます。
内部では、empty_gif
ディレクティブを使用して、メモリから透明な1×1ピクセル.gif
を提供します。 この場所のリクエストには、前に指定した形式を使用して別のファイルにログを記録するように指示します。 最後に、有効期限を「エポック」に設定します。これにより、ブラウザに.gif
をキャッシュしないように通知し、訪問者がページにアクセスするたびに追跡できるようにします。
これで、選択した画像をリクエストする画像をページに追加できます。 たとえば、非常に単純なページは次のようになります。
<html>
<head>
<title>Your Site</title>
</head>
<body>
<h1>Normal Content</h1>
<img src="/logme.gif">
</body>
</html>
訪問者がこのページにアクセスすると、/logme.gif
画像がリクエストされ、Nginxはリクエストの詳細をtracking.log
ファイルに書き込みます。 これは、log_format
を微調整し、テキスト処理ツールを使用してログを解析することにより、より高度なシステムに組み込むことができます。
地理に基づいてコンテンツを区別する
以前、split_clients
モジュールを使用したA/ Bテストの目的で、ユーザーをグループに自動的に分割するようにNginxを構成する方法を説明しました。 Nginxは、IPアドレスの場所に基づいてユーザーをグループに自動的に分割することもできます。
IPアドレスは、特定のプロバイダーがコンパイルする一連のテーブルを使用して、おおよその場所にマップされます。 彼らは主に、さまざまな地理的領域にIPスペースを割り当てる責任がある多数のレジストリからこの情報を受け取ります。 誰かのIPアドレスから収集できる情報は概算であり、トラフィックの発信元を正確に特定する方法ではなく、「最良の推測」として使用する必要があります。
ロケーションデータベースの取得
Nginxはこのデータを使用して、ngx_http_geoip_module
モジュールに含まれているさまざまなディレクティブを使用してクライアントを分離できます。 ただし、IPアドレスからロケーションへのマッピングのデータベースは含まれていないため、それらを個別に取得する必要があります。
Ubuntuでは、次のように入力して国レベルのマッピングを取得できます。
sudo apt-get update
sudo apt-get install geoip-database
国レベルのマッピングを取得するより一般的な方法は、wget
を使用してファイルをダウンロードすることです。 データベースを保存するディレクトリを作成し、次のように入力してファイルをダウンロードできます。
sudo mkdir -p /usr/local/share/GeoIP
cd /usr/local/share/GeoIP
sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
次のように入力してファイルを解凍する必要があります。
sudo gunzip GeoIP.dat.gz
より具体的な都市レベルのデータベースについては、wget
を使用してダウンロードすることもできます。
sudo mkdir -p /usr/local/share/GeoIP
cd /usr/local/share/GeoIP
sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
ここでも、ファイルを解凍する必要があります。
sudo gunzip GeoLiteCity.dat.gz
位置データを使用するようにNginxを構成する
ロケーションデータベースを配置したら、データを利用するようにNginxを構成できます。
次のディレクティブを設定することで、ディスク上の各データベースの場所をNginxに伝えることができます。 これらは、Nginx構成ファイルのhttp
コンテキストで設定する必要があります。
. . .
http {
# If you downloaded the country-level data using `apt-get` uncomment and use:
#geoip_country /usr/share/GeoIP/GeoIP.dat;
# If you downloaded the country-level data using `wget`, use:
geoip_country /usr/local/share/GeoIP/GeoIP.dat;
geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;
. . .
}
場所が設定されると、Nginxがこれらの各データベースに使用する変数を利用できます。 国レベルのデータベースでは、次の変数にアクセスできます。
- $ geoip_country_code :国を表すために使用される2文字の国コード。 たとえば、米国の場合は「US」、ロシアの場合は「RU」です。 これらはここにあります。
- $ geoip_country_code3 :上記とほぼ同じですが、3文字のバリエーションを使用しています。 たとえば、「USA」または「RUS」。
- $ geoip_country_name :リンクリストに表示されている国コードにマップされている名前。 たとえば、「NZ」の場合は「ニュージーランド」。
都市レベルのデータベースは、より多くの変数を提供します。 そのデータベースを使用して、次の機能にアクセスできます。
- $ geoip_area_code :米国の電話番号の従来の市外局番フィールド。 正確なデータを得るためにこれに頼るべきではありません。
- $ geoip_city_continent_code :2文字の大陸コード。
- $ geoip_city_country_code :国レベルのデータベースによって提供されるのと同じ2文字の国コード。
- $ geoip_city_country_code3 :国レベルのデータベースによって提供されるのと同じ3文字の国コード。
- $ geoip_city_country_name :国レベルのデータベースによって提供されるのと同じ国名。
- $ geoip_dma_code :米国の場所のDMAリージョンまたはメトロコード。 これは、こちらにあるGoogleのAdWordsAPIにあります。
- $ geoip_latitude :発信元IPの緯度の推定値。
- $ geoip_longitude :発信元IPの経度の見積もり。
- $ geoip_region :地域、州、州などの政治地域を表すために使用される2文字の地域コード。
- $ geoip_region_name :上記の地域コードに関連付けられているフルネーム。
- $ geoip_city :発信元IPに関連付けられている都市名。
- $ geoip_postal_code :IPが配置されている地域の郵便番号。
繰り返しになりますが、これらの変数を介して利用可能なデータは、最良の推測に基づいていることを強調することが重要です。 それでも、これはさまざまな分野にさまざまなコンテンツを提供するためのいくつかの素晴らしい機会を提供します。
多くの場合、上記の変数の1つをmap
ディレクティブとともに使用して、別の変数の値を条件付きで設定します。 これにより、データベースがクライアントの場所について教えてくれることによって決定される値を持つ変数を作成できます。
map
ディレクティブは、http
コンテキストでも使用する必要があります。 たとえば、訪問者がオーストラリアまたはシンガポールからの場合、さまざまなコンテンツを表示するようにサイトを構成できます。 これを確認する最良の方法は、おそらく国または都市のデータベースにある2文字または3文字の国コードのいずれかを使用することです。
この例では、$geoip_country_code
を使用します。 その変数の値によって、作成する$site_version
変数に何を格納するかが決まります。 これを使用して、提供元のドキュメントルートを決定します。
http {
# If you downloaded the country-level data using `apt-get` uncomment and use:
#geoip_country /usr/share/GeoIP/GeoIP.dat;
# If you downloaded the country-level data using `wget`, use:
geoip_country /usr/local/share/GeoIP/GeoIP.dat;
geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;
map $geoip_country_code $site_version {
default "";
AU "/australia";
SG "/singapore";
}
. . .
}
これにより、この目的のために特別に作成している変数である$site_version
の値が設定されます。 訪問者の国コードがオーストラリア出身であることを示している場合(AU
)、$site_version
を「/australia」に設定します。 訪問者がシンガポール(「SG」)からの場合は、$site_version
を「/singapore」に設定します。 国コードが他の値を示している場合は、$site_version
を空の文字列に設定します。
これにより、特定の国からの訪問者のドキュメントルートを変更できます。 これは、クライアントの地理的位置データに基づいてコンテンツを区別できる1つの方法を示すための任意の選択です。
ドキュメントルートを変更するには、サーバーブロック内のroot
ディレクティブを次のように設定する必要があります。
http {
# If you downloaded the country-level data using `apt-get` uncomment and use:
#geoip_country /usr/share/GeoIP/GeoIP.dat;
# If you downloaded the country-level data using `wget`, use:
geoip_country /usr/local/share/GeoIP/GeoIP.dat;
geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;
map $geoip_country_code $site_version {
default "";
AU "/australia";
SG "/singapore";
}
. . .
server {
. . .
root /usr/share/nginx/html${site_version};
. . .
}
}
ユーザーがオーストラリア出身の場合、リクエストを処理するためのドキュメントルートは/usr/share/nginx/html/australia
に変更されます。 同様に、シンガポールからの訪問者の場合、コンテンツは/usr/share/nginx/html/singapore
から提供されます。 他の訪問者の場合、$site_version
変数が空の文字列に設定されているため、/usr/share/nginx/html
からコンテンツを引き続き受信します。
これを簡単にテストするために、デフォルトの/usr/share/nginx/html
ドキュメントルートを設定できます。 その場所に移動することから始めます。
cd /usr/share/nginx/html
次に、前述のディレクトリを作成し、いくつかの非常に基本的なコンテンツを新しい各ディレクトリ内のindex.html
ファイルに挿入できます。 これにより、現在地が提供されるコンテンツに影響を与えているかどうかを確認できます。
sudo mkdir australia && echo "<h1>australia</h1>" | sudo tee australia/index.html
sudo mkdir singapore && echo "<h1>singapore</h1>" | sudo tee singapore/index.html
これがすべてセットアップされたら、構成をテストしてNginxをリロードできます。
sudo nginx -t
sudo service nginx restart
これで、 GeoPeeker サイトを再度利用して、さまざまな場所からさまざまなコンテンツが提供されているかどうかを確認できます。 オーストラリアとシンガポールはどちらも、サイトで確認できるオプションです。
ここでは、米国またはアイルランドからの訪問者のデフォルトページと、オーストラリアまたはシンガポールからの訪問者向けに追加したテストテキストを確認できます。
これは、クライアントのIPアドレスをロケーションデータベースと照合することにより、Nginxが提供するコンテンツを正しく選択していることを検証します。
結論
これらの戦略と機能を利用することで、分析の収集を開始して、サイトのコンテンツについてより多くの情報に基づいた決定を下すことができます。 このタイプのデータをキャプチャするために利用できる外部ツールは確かにたくさんありますが、他のソリューションに時間を費やす前に、Nginxネイティブツールを使用するオプションを用意することをお勧めします。