Ubuntu20.04でNginxのマップモジュールを使用する方法
序章
Nginxのマップモジュールを使用すると、Nginxの構成ファイルに変数を作成できます。この変数の値は条件付きです。つまり、他の変数の値に依存します。 このガイドでは、Nginxのマップモジュールを使用して2つの例を実装する方法を説明します。古いWebサイトのURLから新しいURLへのリダイレクトのリストを設定する方法と、Webサイトへのトラフィックを制御する国の許可リストを作成する方法です。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
1台のUbuntu20.04サーバーで、sudo権限を持つ通常の非rootユーザー。 この初期サーバーセットアップチュートリアルに従って、サーバーを準備する方法を学ぶことができます。
-
Ubuntu 20.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つ表示されます。
OutputHome
それでは、に存在しないファイルにアクセスしてみましょう。 /var/www/html/
、 お気に入り old.html
:
- curl -L http://localhost/old.html
応答は、システムエラーメッセージ 404 Not Found になります。これは、ページが存在しないことを意味します。
Output<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.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で作成した簡単なホームページが表示されます。
OutputHome
これは、マップが適切に構成されていることを意味し、マップにエントリを追加することでURLをリダイレクトするために使用できます。
URLのリダイレクトは、マップモジュールの便利なアプリケーションの1つです。 次のステップで検討するもう1つの方法は、訪問者の地理的位置に基づいてトラフィックをフィルタリングすることです。
ステップ3—特定の国へのWebサイトアクセスの制限
場合によっては、サーバーが大量の自動化された悪意のある要求を受信することがあります。 これは、DDoS攻撃、Webサイトの管理パネルにパスワードをブルートフォース攻撃する試み、またはソフトウェアの既知の脆弱性を悪用してWebサイトを攻撃し、それを使用してスパムを送信したり、サイトのコンテンツを変更したりする試みである可能性があります。
このような自動化された攻撃は、さまざまな国のさまざまな分散サーバーから発生する可能性があり、ブロックが困難になります。 このような攻撃の影響を軽減するための1つの解決策は、Webサイトにアクセスできる国の許可リストを作成することです。
これは完璧なソリューションではありませんが、訪問者の地理的な場所に基づいてWebサイトへのアクセスを制限することが賢明な選択であり、Webサイトのオーディエンスを制限しない状況では、このソリューションには高速でエラーが発生しにくいという利点があります。
サーバーレベルでのフィルタリングは、Webサイトレベルでのフィルタリングよりも高速であり、すべてのリクエスト(画像などの静的ファイルを含む)もカバーします。 この種のフィルタリングは、リクエストがWebサイトのソフトウェアに直接到達するのを防ぎ、脆弱性の悪用を困難にします。
地理的フィルタリングを利用するには、最初にNginx GeoIPモジュールと、訪問者のIPアドレスとそれぞれの国の間のマッピングを含むGeoIPデータベースをインストールする必要があります。 そのためには、以下を実行してみましょう。
- sudo apt install libnginx-mod-http-geoip geoip-database
それでは、最初に新しい構成ファイルを作成しましょう。
- sudo nano /etc/nginx/conf.d/geoip.conf
次の内容をファイルに貼り付けます。 これにより、訪問者のIPアドレスに基づいて国を識別するためのGeoIPデータベースの場所がNginxに通知されます。
# 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
プレースホルダーとして。 これらの変数を、許可する1つまたは複数の国の2文字の国コードに置き換えます。 ISOのすべての国コードの完全な検索可能なリストを使用して検索できます。 たとえば、米国のコードは次のとおりです。 US
.
最初の例とは異なり、これでは map
ブロック、 $allowed_country
変数は常に何かに設定されます。 デフォルトでは、 no
; の場合 $geoip_country_code
変数はブロック内の国コードの1つと一致し、次のように設定されます yes
. の場合 $allowed_country
変数は no
、実際のWebサイトを提供する代わりに、444接続が応答なしで閉じられましたを返します。
新しい構成を有効にするには、Nginxを再起動します。
- sudo systemctl restart nginx
自分の国を許可リストに追加しなかった場合、訪問しようとすると http://your_server_ip
、ページが機能していませんまたはページがデータを送信していませんのようなエラーメッセージが表示されます。 国を許可リストに追加した場合は、以前と同じようにホームが表示されます。
結論
マップモジュールは、単純な比較を可能にするだけでなく、より複雑な一致を可能にする正規表現もサポートします。 複数の条件を評価する必要がある場合は、構成ファイルを明確にするための優れた方法です。
より詳細な情報は、Nginxの公式マップモジュールドキュメントにあります。