序章

Webサイト用にサーバーを構成する場合、実装する必要のある一般的な条件付きアクションがいくつかあります。 たとえば、一部のファイルをユーザーのブラウザで他のファイルよりも長くキャッシュする必要がある場合や、Webサイトの一部を安全な接続(ユーザーのパスワードが必要なものなど)経由でのみ許可する必要がある一方で、Webサイトの他の部分はキャッシュしない場合があります。 t。

もう1つの簡単で一般的な例は、古いWebページの代わりに新しいWebページが公開されたときに、すべての古いアドレスが正しい場所にリダイレクトされることを確認することです。 これは、古いリンクやブックマークが機能しなくなることはなく、Googleのキャッシュも保持されるため便利です。

Nginxのマップモジュールを使用すると、Nginxの構成ファイルに変数を作成できます。この変数の値は条件付きです。つまり、他の変数の値に依存します。 このガイドでは、Nginxのマップモジュールを使用して2つの例を実装する方法を説明します。古いWebサイトのURLから新しいURLへのリダイレクトのリストを設定する方法と、Webサイトへのトラフィックを制御する国のホワイトリストを作成する方法です。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—サンプルWebページの作成とテスト

まず、新しく公開されたWebサイトを表すテストファイルを作成します。 このファイルを使用して構成をテストします。

簡単なページを作成しましょう、 index.html、デフォルトのNginxWebサイトディレクトリにあります。 このファイルには、中身を説明するプレーンテキストが含まれています:ホーム。

  1. sudo sh -c 'echo "Home" > /usr/share/nginx/html/index.html'

このテストファイルを配置したら、次に、次の方法で正しく提供されていることを確認します。 curl. 指定する必要はありません index.html 正確なファイル名が指定されていない場合、そのファイルはデフォルトで提供されるため、このコマンドの場合。

  1. curl http://localhost/

それに応じて、次のようにHomeという単語が1つ表示されます。

Nginxの応答
Home

に存在しないファイルにアクセスしてみましょう /usr/share/nginx/html、 お気に入り old.html.

  1. curl -L http://localhost/old.html

応答は、システムエラーメッセージ 404 Not Found になります。これは、ページが存在しないことを意味します。

Nginxの応答

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>The page is not found</title>
. . .
</html>

このチュートリアルではダミーのWebサイトを使用していますが、 old.html は、以前は存在していて削除された実際のWebサイト上のページでしたが、404を返すと、そのページへのすべてのリンクが壊れていることを意味します。 これらのリンクは、Googleによってインデックスに登録されたり、印刷または書き留められたり、その他の手段で共有されたりしている可能性があるため、これは理想的とは言えません。

次のステップでは、マップモジュールを利用して、ビューアを新しい置換に自動的にリダイレクトすることにより、この古いアドレスが再び機能することを確認します。

ステップ2—リダイレクトの構成

数ページしかない小さなウェブサイトの場合、シンプル if 条件付きステートメントは、リダイレクトなどに使用できます。 ただし、条件のリストが長くなるにつれて、このような構成を長期的に維持または拡張することは容易ではありません。

マップモジュールは、よりエレガントで簡潔なソリューションです。 これにより、Nginx変数値を条件のリストと比較し、一致に応じて新しい値を変数に関連付けることができます。 この例では、要求されたURLを、新しい対応するページにリダイレクトする古いページのリストと比較します。 古いアドレスごとに、新しいアドレスを関連付けます。

マップモジュールはコアNginxモジュールです。つまり、使用するために個別にインストールする必要はありません。 必要なマップとリダイレクトの構成を作成するには、デフォルトのサーバーブロックNginx構成ファイルを開きます。 vi (これが vi の簡単な紹介です)またはお気に入りのテキストエディタです。

  1. sudo vi /etc/nginx/nginx.conf

を見つける server 次のような構成ブロック:

/etc/nginx/nginx.conf
. . .

server {
    listen 80 default_server;
    listen [::]:80 default_server;

. . .

2つの新しいセクションを追加します。1つは前に server ブロック、およびその中の1つ。

前のセクション server ブロックは新しいです map ブロック。マップモジュールを使用して、古いURLと新しいURLの間のマッピングを定義します。 内部のセクション server ブロックはリダイレクト自体です。

変更された/etc/nginx/nginx.conf
. . .

# Old website redirect map
#
map $uri $new_uri {
    /old.html /index.html;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Old website redirect
    if ($new_uri) {
        rewrite ^ $new_uri permanent;
    }
. . .

The map $uri $new_uri ディレクティブはシステムの内容を取得します $uri 変数。要求されたページのURLアドレスを含み、中括弧内の条件のリストと比較します。 条件のリストの各項目には、2つのセクションがあります。一致する値と、一致する場合に変数に割り当てる新しい値です。

この線 /old.html /index.htmlmap ブロックとは、 $uriの値は /old.html, $new_uri に変更されます /index.html. 一致しない場合は変更されません。 ここでは、1つの条件のみを定義しますが、マップには必要な数の条件を定義できます。

次に、条件付きを使用します if 内部のステートメント server ブロック、私たちは $new_uri 変数の値が設定されます。 そうである場合は、マップ内の条件が満たされていることを意味し、を使用して新しいWebサイトにリダイレクトする必要があります。 rewrite 指図。 The permanent キーワードにより、リダイレクトが 301 Moved Permanently HTTPリダイレクトになります。これは、古いアドレスが無効になり、オンラインに戻らないことを意味します。

ファイルを保存して閉じ、終了します。

新しい構成を有効にするには、Nginxを再起動します。

  1. sudo systemctl restart nginx

新しい構成をテストするには、前と同じ要求を実行します。

  1. curl -L http://localhost/old.html

今回は、出力に 404 NotFoundエラーはありません。 代わりに、手順1で作成した簡単なホームページが表示されます。

Nginxの応答
Home

これは、マップが適切に構成されており、マップにエントリを追加することでURLをリダイレクトするために使用できることを意味します。

URLのリダイレクトは、マップモジュールの便利なアプリケーションの1つです。 次のステップで検討するもう1つの方法は、訪問者の地理的位置に基づいてトラフィックをフィルタリングすることです。

ステップ3—特定の国へのWebサイトアクセスの制限

場合によっては、サーバーが大量の自動化された悪意のある要求を受信することがあります。 これは、DDoS攻撃、Webサイトの管理パネルにパスワードをブルートフォース攻撃する試み、またはソフトウェアの既知の脆弱性を悪用してWebサイトを攻撃し、それを使用してスパムを送信したり、サイトのコンテンツを変更したりする試みである可能性があります。

このような自動化された攻撃は、さまざまな国のさまざまな分散サーバーから発生する可能性があり、ブロックが困難になります。 このような攻撃の影響を軽減するための1つの解決策は、Webサイトにアクセスできる国のホワイトリストを作成することです。

これは完璧なソリューションではありませんが、訪問者の地理的な場所に基づいてWebサイトへのアクセスを制限することが賢明な選択であり、Webサイトの対象者を制限しない状況では、このソリューションには高速でエラーが発生しにくいという利点があります。

サーバーレベルでのフィルタリングは、Webサイトレベルでのフィルタリングよりも高速であり、すべてのリクエスト(画像などの静的ファイルを含む)もカバーします。 この種のフィルタリングは、リクエストがWebサイトのソフトウェアに到達するのを完全に防ぎ、脆弱性の悪用を困難にします。

地理的フィルタリングを利用するために、最初に新しい構成ファイルを作成しましょう。

  1. sudo vi /etc/nginx/conf.d/geoip.conf

次の内容をファイルに貼り付けます。 これにより、訪問者のIPアドレスとそれぞれの国の間のマッピングを含むGeoIPデータベースの場所がNginxに通知されます。 このデータベースにはUbuntu16.04がプリインストールされています。

/etc/nginx/conf.d/geoip.conf
# GeoIP database path
#

geoip_country /usr/share/GeoIP/GeoIP.dat;

次のステップは、必要なマップと制限の構成を作成することです。 デフォルトのサーバーブロックNginx構成を開きます。

  1. sudo vi /etc/nginx/nginx.conf

を見つける server 手順1と2で変更した後、次のように見える構成ブロック:

/ etc / nginx / sites-available / default
. . .

# Old website redirect map
#
map $uri $new_uri {
    /old.html /index.html;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Old website redirect
    if ($new_uri) {
        rewrite ^ $new_uri permanent;
    }
. . .

2つの新しいセクションを追加します。1つは前に server ブロックとその中の1つ。

前のセクション server ブロックは新しいです map ブロック。デフォルトのアクション(アクセスは許可されていません)と、Webサイトへのアクセスを許可されている国コードのリストを定義します。 内部のセクション server ブロックは、次の場合にWebサイトへのアクセスを拒否します map 結果はそう言います。

変更された/etc/ nginx / sites-available / default
. . .

# 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_1country_code_2 プレースホルダーとして。 これらの変数を、ホワイトリストに登録する1つまたは複数の国の2文字の国コードに置き換えます。 ISOのすべての国コードの完全な検索可能なリストを使用して検索できます。 たとえば、米国の2文字コードは次のとおりです。 US.

最初の例とは異なり、これでは map ブロック、 $allowed_country 変数は常に何かに設定されます。 デフォルトでは、 no; の場合 $geoip_country_code 変数はブロック内の国コードの1つと一致し、次のように設定されます yes. の場合 $allowed_country 変数は no、実際のWebサイトを提供する代わりに、444接続が応答なしで閉じられましたを返します。

新しい構成を有効にするには、Nginxを再起動します。

  1. sudo systemctl restart nginx

ホワイトリストに国を追加しなかった場合、訪問しようとすると http://your_server_ipページが機能していませんまたはページがデータを送信していませんのようなエラーメッセージが表示されます。 国をホワイトリストに追加すると、以前と同じようにホームが表示されます。

結論

これは、マップモジュールの使用方法に関する非常に単純な例かもしれませんが、他の多くの異なる方法で使用できるメカニズムを示しています。 マップモジュールは、単純な比較を可能にするだけでなく、より複雑な一致を可能にする正規表現もサポートします。 複数の条件を評価する必要がある場合は、構成ファイルをよりクリーンにするための優れた方法です。

マップモジュールのもう1つの非常に一般的な使用例は、SSL以外の環境でのWebサイトの安全な部分の条件付きリダイレクトです。 たとえば、パスワード入力を必要とするフォームに対してのみ強制SSL接続を設定することは、実際のシナリオでマップモジュールを適用する方法の良い例であり、そのような設定を試すことをお勧めします。

より詳細な情報は、Nginxの公式マップモジュールドキュメントにあります。