Ubuntu16.04でNginxのマップモジュールを使用する方法
序章
Webサイト用にサーバーを構成する場合、実装する必要のある一般的な条件付きアクションがいくつかあります。 たとえば、一部のファイルはユーザーのブラウザによって他のファイルよりも長くキャッシュされる必要があります。または、Webサイトの一部は安全な接続(ユーザーのパスワードが必要なものなど)を介してのみ許可されるべきですが、Webサイトの他の部分はそうではありません。 t。
もう1つの簡単で一般的な例は、古いWebページの代わりに新しいWebページが公開されたときに、すべての古いアドレスが正しい場所にリダイレクトされることを確認することです。 これは、古いリンクやブックマークが機能しなくなることはなく、Googleのキャッシュも保持されるため便利です。
Nginxのマップモジュールを使用すると、Nginxの構成ファイルに変数を作成できます。この変数の値は条件付きです。つまり、他の変数の値に依存します。 このガイドでは、Nginxのマップモジュールを使用して2つの例を実装する方法を説明します。古いWebサイトのURLから新しいURLへのリダイレクトのリストを設定する方法と、Webサイトへのトラフィックを制御する国の許可リストを作成する方法です。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
この初期サーバーセットアップチュートリアルでセットアップされた1つのUbuntu16.04サーバー(sudo非rootユーザーを含む)。
-
Ubuntu 16.04チュートリアルにNginxをインストールする方法に従って、サーバーにNginxをインストールします。
ステップ1—サンプルWebページの作成とテスト
まず、新しく公開されたWebサイトを表すテストファイルを作成します。 このファイルを使用して構成をテストします。
デフォルトのNginxWebサイトディレクトリに簡単なページindex.html
を作成しましょう。 このファイルには、中身を説明するプレーンテキストが含まれています:ホーム。
- sudo sh -c 'echo "Home" > /var/www/html/index.html'
このテストファイルを配置したら、次にcurl
で正しく提供されていることを確認します。 正確なファイル名が指定されていない場合、このファイルはデフォルトで提供されるため、このコマンドにindex.html
を指定する必要はありません。
- curl http://localhost/
それに応じて、次のようにHomeという単語が1つ表示されます。
Home
次に、old.html
のように、/var/www/html/
に存在しないファイルにアクセスしてみましょう。
- curl -L http://localhost/old.html
応答は、システムエラーメッセージ 404 Not Found になります。これは、ページが存在しないことを意味します。
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>
このチュートリアルではダミーのWebサイトを使用していますが、old.html
が以前に存在して削除された実際のWebサイトのページである場合、404を返すと、そのページへのすべてのリンクが壊れます。 これらのリンクは、Googleによってインデックスに登録されたり、印刷または書き留められたり、その他の手段で共有されたりしている可能性があるため、これは理想的とは言えません。
次のステップでは、マップモジュールを利用して、ビューアを新しい置換に自動的にリダイレクトすることにより、この古いアドレスが再び機能することを確認します。
ステップ2—リダイレクトの構成
数ページしかない小さなWebサイトの場合、単純なif
条件ステートメントをリダイレクトなどに使用できます。 ただし、条件のリストが長くなるにつれて、このような構成を長期的に維持または拡張することは容易ではありません。
マップモジュールは、よりエレガントで簡潔なソリューションです。 これにより、Nginx変数値を条件のリストと比較し、一致に応じて新しい値を変数に関連付けることができます。 この例では、要求されたURLを、新しい対応するページにリダイレクトする古いページのリストと比較します。 古いアドレスごとに、新しいアドレスを関連付けます。
マップモジュールはコアNginxモジュールです。つまり、使用するために個別にインストールする必要はありません。 必要なマップとリダイレクトの構成を作成するには、nano
またはお気に入りのテキストエディターでデフォルトのサーバーブロックNginx構成ファイルを開きます。
- sudo nano /etc/nginx/sites-available/default
次のようなserver
構成ブロックを見つけます。
. . .
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
. . .
2つの新しいセクションを追加します。1つはserver
ブロックの前、もう1つはその中にあります。
server
ブロックの前のセクションは、新しいmap
ブロックであり、マップモジュールを使用して古いURLと新しいURLの間のマッピングを定義します。 server
ブロック内のセクションは、リダイレクト自体です。
. . .
# Default server configuration
#
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .
map $uri $new_uri
ディレクティブは、要求されたページのURLアドレスを含むシステム$uri
変数の内容を取得し、それを中括弧内の条件のリストと比較します。 条件のリストの各項目には、一致する値と、一致する場合に変数に割り当てる新しい値の2つのセクションがあります。
map
ブロック内の/old.html /index.html
の行は、$uri
の値が/old.html
の場合、$new_uri
が/index.html
。 一致しない場合は変更されません。 ここでは、1つの条件のみを定義しますが、マップには必要な数の条件を定義できます。
次に、server
ブロック内の条件付きif
ステートメントを使用して、$new_uri
変数の値が設定されているかどうかを確認します。 そうである場合は、マップ内の条件が満たされていることを意味し、rewrite
コマンドを使用して新しいWebサイトにリダイレクトする必要があります。 permanent
キーワードは、リダイレクトが 301 Moved Permanently HTTPリダイレクトになることを保証しました。これは、古いアドレスが無効になり、オンラインに戻らないことを意味します。
ファイルを保存して閉じ、終了します。
新しい構成を有効にするには、Nginxを再起動します。
- sudo systemctl restart nginx
新しい構成をテストするには、前と同じ要求を実行します。
- curl -L http://localhost/old.html
今回は、出力に 404 NotFoundエラーはありません。 代わりに、手順1で作成した簡単なホームページが表示されます。
Home
これは、マップが適切に構成されており、マップにエントリを追加することでURLをリダイレクトするために使用できることを意味します。
URLのリダイレクトは、マップモジュールの便利なアプリケーションの1つです。 次のステップで検討するもう1つの方法は、訪問者の地理的位置に基づいてトラフィックをフィルタリングすることです。
ステップ3—特定の国へのWebサイトアクセスの制限
場合によっては、サーバーが大量の自動化された悪意のある要求を受信することがあります。 これは、DDoS攻撃、Webサイトの管理パネルにパスワードをブルートフォース攻撃する試み、またはソフトウェアの既知の脆弱性を悪用してWebサイトを攻撃し、それを使用してスパムを送信したり、サイトのコンテンツを変更したりする試みである可能性があります。
このような自動化された攻撃は、さまざまな国のさまざまな分散サーバーから発生する可能性があり、ブロックが困難になります。 このような攻撃の影響を軽減するための1つの解決策は、Webサイトにアクセスできる国の許可リストを作成することです。
これは完璧なソリューションではありませんが、訪問者の地理的な場所に基づいてWebサイトへのアクセスを制限することが賢明な選択であり、Webサイトの対象者を制限しない状況では、このソリューションには高速でエラーが発生しにくいという利点があります。
サーバーレベルでのフィルタリングは、Webサイトレベルでのフィルタリングよりも高速であり、すべてのリクエスト(画像などの静的ファイルを含む)もカバーします。 この種のフィルタリングは、リクエストがWebサイトのソフトウェアに到達するのを完全に防ぎ、脆弱性の悪用を困難にします。
地理的フィルタリングを利用するために、最初に新しい構成ファイルを作成しましょう。
- sudo nano /etc/nginx/conf.d/geoip.conf
次の内容をファイルに貼り付けます。 これにより、訪問者のIPアドレスとそれぞれの国の間のマッピングを含むGeoIPデータベースの場所がNginxに通知されます。 このデータベースにはUbuntu16.04がプリインストールされています。
. . .
# GeoIP database path
#
geoip_country /usr/share/GeoIP/GeoIP.dat;
次のステップは、必要なマップと制限の構成を作成することです。 デフォルトのサーバーブロックNginx構成を開きます。
- sudo nano /etc/nginx/sites-available/default
server
構成ブロックを見つけます。これは、手順1と2で変更した後、次のようになります。
. . .
# Default server configuration
#
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .
2つの新しいセクションを追加します。1つはserver
ブロックの前、もう1つはその中にあります。
server
ブロックの前のセクションは、新しいmap
ブロックであり、デフォルトのアクション(アクセスは許可されていません)と、Webサイトへのアクセスを許可されている国コードのリストを定義しています。 server
ブロック内のセクションは、map
の結果にそのように示されている場合、Webサイトへのアクセスを拒否します。
. . .
# Default server configuration
#
# Allowed countries
#
map $geoip_country_code $allowed_country {
default no;
country_code_1 yes;
country_code_2 yes;
}
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Disallow access based on GeoIP
if ($allowed_country = no) {
return 444;
}
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .
ファイルを保存して閉じ、終了します。
ここでは、プレースホルダーとしてcountry_code_1
とcountry_code_2
を使用しました。 これらの変数を、許可リストにする国の2文字の国コードに置き換えます。 ISOのすべての国コードの完全な検索可能なリストを使用して検索できます。 たとえば、米国の2文字コードはUS
です。
最初の例とは異なり、このmap
ブロックでは、$allowed_country
変数は常に何かに設定されます。 デフォルトでは、no
に設定されています。 $geoip_country_code
変数がブロック内の国コードの1つと一致する場合、yes
に設定されます。 $allowed_country
変数がno
の場合、実際のWebサイトにサービスを提供する代わりに、444接続が応答なしで閉じられましたを返します。
新しい構成を有効にするには、Nginxを再起動します。
- sudo systemctl restart nginx
国を許可リストに追加しなかった場合、http://your_server_ip
にアクセスしようとすると、ページが機能していませんまたはページのようなエラーメッセージが表示されます。データを送信しませんでした。 国を許可リストに追加すると、以前と同じようにホームが表示されます。
結論
これは、マップモジュールの使用方法に関する非常に単純な例かもしれませんが、他の多くの異なる方法で使用できるメカニズムを示しています。 マップモジュールは、単純な比較を可能にするだけでなく、より複雑な一致を可能にする正規表現もサポートします。 複数の条件を評価する必要がある場合は、構成ファイルをよりクリーンにするための優れた方法です。
マップモジュールのもう1つの非常に一般的な使用例は、SSL以外の環境でのWebサイトの安全な部分の条件付きリダイレクトです。 たとえば、パスワード入力を必要とするフォームに対してのみ強制SSL接続を設定することは、実際のシナリオでマップモジュールを適用する方法の良い例であり、そのような設定を試すことをお勧めします。
より詳細な情報は、Nginxの公式マップモジュールドキュメントにあります。