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