Ubuntu16.04でNginxのマップモジュールを使用する方法
序章
Webサイト用にサーバーを構成する場合、実装する必要のある一般的な条件付きアクションがいくつかあります。 たとえば、一部のファイルをユーザーのブラウザで他のファイルよりも長くキャッシュする必要がある場合や、Webサイトの一部を安全な接続(ユーザーのパスワードが必要なものなど)経由でのみ許可する必要がある一方で、Webサイトの他の部分はキャッシュしない場合があります。 t。
もう1つの簡単で一般的な例は、古いWebページの代わりに新しいWebページが公開されたときに、すべての古いアドレスが正しい場所にリダイレクトされることを確認することです。 これは、古いリンクやブックマークが機能しなくなることはなく、Googleのキャッシュも保持されるため便利です。
Nginxのマップモジュールを使用すると、Nginxの構成ファイルに変数を作成できます。この変数の値は条件付きです。つまり、他の変数の値に依存します。 このガイドでは、Nginxのマップモジュールを使用して2つの例を実装する方法を見ていきます。古いウェブサイトのURLから新しいURLへのリダイレクトのリストを設定する方法と、ウェブサイトへのトラフィックを制御する国の許可リストを作成する方法です。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
この初期サーバーセットアップチュートリアルでセットアップされた1つのUbuntu16.04サーバー(sudo非rootユーザーを含む)。
-
Ubuntu 16.04チュートリアルにNginxをインストールする方法に従って、サーバーにNginxをインストールします。
ステップ1—サンプルWebページの作成とテスト
まず、新しく公開されたWebサイトを表すテストファイルを作成します。 このファイルを使用して構成をテストします。
簡単なページを作成しましょう、 index.html
、デフォルトのNginxWebサイトディレクトリにあります。 このファイルには、中身を説明するプレーンテキストが含まれています:ホーム。
- sudo sh -c 'echo "Home" > /var/www/html/index.html'
このテストファイルを配置したら、次に、次の方法で正しく提供されていることを確認します。 curl
. 指定する必要はありません index.html
正確なファイル名が指定されていない場合、そのファイルはデフォルトで提供されるため、このコマンドの場合。
- curl http://localhost/
それに応じて、次のようにHomeという単語が1つ表示されます。
Home
に存在しないファイルにアクセスしてみましょう /var/www/html/
、 お気に入り old.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—リダイレクトの構成
数ページしかない小さなウェブサイトの場合、シンプル if
条件付きステートメントは、リダイレクトなどに使用できます。 ただし、条件のリストが長くなるにつれて、このような構成を長期的に維持または拡張することは容易ではありません。
マップモジュールは、よりエレガントで簡潔なソリューションです。 これにより、Nginx変数値を条件のリストと比較し、一致に応じて新しい値を変数に関連付けることができます。 この例では、要求されたURLを、新しい対応するページにリダイレクトする古いページのリストと比較します。 古いアドレスごとに、新しいアドレスを関連付けます。
マップモジュールはコアNginxモジュールです。つまり、使用するために個別にインストールする必要はありません。 必要なマップとリダイレクトの構成を作成するには、デフォルトのサーバーブロックNginx構成ファイルを開きます。 nano
またはお気に入りのテキストエディタ。
- 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;
}
. . .
The map $uri $new_uri
ディレクティブはシステムの内容を取得します $uri
変数。要求されたページのURLアドレスを含み、中括弧内の条件のリストと比較します。 条件のリストの各項目には、2つのセクションがあります。一致する値と、一致する場合に変数に割り当てる新しい値です。
この線 /old.html /index.html
中 map
ブロックとは、 $uri
の値は /old.html
, $new_uri
に変更されます /index.html
. 一致しない場合は変更されません。 ここでは、1つの条件のみを定義しますが、マップには必要な数の条件を定義できます。
次に、条件付きを使用します if
内部のステートメント server
ブロック、私たちは $new_uri
変数の値が設定されます。 そうである場合は、マップ内の条件が満たされていることを意味し、を使用して新しいWebサイトにリダイレクトする必要があります。 rewrite
指図。 The 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
ブロックは、次の場合にWebサイトへのアクセスを拒否します map
結果はそう言います。
. . .
# 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の公式マップモジュールドキュメントにあります。