CentOS 7でNginxのマップモジュールを使用する方法

前書き

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

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

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

前提条件

このチュートリアルを実行するには、次のものが必要です。

[[step-1 -—- creating-and-testing-an-example-webpage]] ==ステップ1—サンプルWebページの作成とテスト

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

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

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

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

curl http://localhost/

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

Nginxの応答

Home

それでは、old.htmlのように/usr/share/nginx/htmlに存在しないファイルにアクセスしてみましょう。

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

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

Nginxの応答




    
        The page is not found
. . .

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

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

[[step-2 -—- configuring-the-redirects]] ==ステップ2—リダイレクトの構成

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

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

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

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ブロックであり、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;
    }
. . .

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 Not Foundエラーはありません。 代わりに、ステップ1で作成したシンプルなホームページが表示されます。

Nginxの応答

Home

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

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

[[step-3 -—- restricting-website-access-to-certain-countries]] ==ステップ3—特定の国へのWebサイトアクセスの制限

サーバーは、過剰な量の自動化された悪意のあるリクエストを受け取ることがあります。 これは、DDoS攻撃、ウェブサイト管理パネルへのブルートフォースパスワードの試み、またはソフトウェアの既知の脆弱性を悪用してウェブサイトを攻撃し、それを使用してスパムを送信したり、サイトコンテンツを変更したりする可能性があります。

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

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

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

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

sudo vi /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 vi /etc/nginx/nginx.conf

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

/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ブロック内のセクションは、mapの結果がそう言う場合、Webサイトへのアクセスを拒否します。

変更された/ 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を使用しました。 これらの変数を、ホワイトリストに登録する国の2文字の国コードに置き換えます。 the ISO’s full, searchable list of all country codesを使用して検索できます。 たとえば、米国の2文字のコードはUSです。

最初の例とは異なり、このmapブロックでは、$allowed_country変数は常に何かに設定されます。 デフォルトでは、noに設定されています。 $geoip_country_code変数がブロック内の国コードの1つと一致する場合、yesに設定されます。 $allowed_country変数がnoの場合、実際のWebサイトにサービスを提供する代わりに、444 Connection Closed Without Responseを返します。

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

sudo systemctl restart nginx

国をホワイトリストに追加しなかった場合、http://your_server_ipにアクセスしようとすると、The page isn’t workingThe page didn’t send any dataなどのエラーメッセージが表示されます。 国をホワイトリストに追加すると、以前と同じようにHomeが表示されます。

結論

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

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

より詳細な情報はin Nginx’s official map module documentationにあります。

Related