Webサイト用にサーバーを構成する場合、いくつかの一般的な条件付き操作を実行する必要がある場合があります。たとえば、一部のファイルは他のファイルよりも長くユーザーのブラウザによってキャッシュされる場合があります。または、ウェブサイトの一部では安全な接続のみを許可する必要がありますが(ユーザーのパスワードが必要なものなど)、ウェブサイトの他の部分では許可しないでください。 。
もう1つの簡単な一般的な例は、古いページではなく新しいページが公開されたときに、すべての古いアドレスが正しい場所にリダイレクトされるようにすることです。これは、古いリンクとブックマークが機能を停止せず、Googleのキャッシュも保持することを意味するので便利です。
Nginxのマップモジュールを使用すると、値が条件付きであるNginxの構成ファイルに変数を作成できます。つまり、他の変数の値に依存します。このガイドでは、Nginxのマップモジュールを使用して2つの例を実装する方法を学習します。古いWebサイトのURLから新しいWebサイトへのリダイレクトリストを設定する方法と、Webサイトのトラフィックを制御する国/地域のホワイトリストを作成する方法です。
このチュートリアルに従うには、次のものが必要です。
まず、新しく公開されたWebサイトを表すテストファイルを作成します。このファイルを使用して構成をテストします。
デフォルトのNginxWebサイトディレクトリに簡単なページ index.html
を作成しましょう。このファイルには、ホームページという簡単なテキストの説明しかありません。
sudo sh -c 'echo "Home" > /var/www/html/index.html'
このテストファイルでは、次に curl
を使用して、正しく使用されているかどうかを確認します。このコマンドに index.html
を指定する必要はありません。正確なファイル名が指定されていない場合、デフォルトで指定されるためです。
curl http://localhost/
応答として、家は次のような単語が表示されます。
Home
ここで、 old.html
など、/ var / www / 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によってインデックスに登録されたり、印刷または記録されたり、その他の方法で共有されたりしている可能性があるため、これは理想的ではありません。
次のステップでは、mapモジュールを使用して、ビューアを新しい置換に自動的にリダイレクトすることにより、この古いアドレスが再び機能することを確認します。
ページ数が少ない小規模なサイトの場合、リダイレクトなどに単純な「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
ブロックであり、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;}...
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で作成した簡単なホームページが表示されます。
Home
これは、マップが適切に構成されており、マップにエントリを追加することでURLをリダイレクトできることを意味します。
リダイレクトURLは、マップモジュールの便利なアプリケーションです。もう1つは、次のステップで、訪問者の地理的な場所に基づいてトラフィックをフィルタリングする方法について説明します。
場合によっては、サーバーが自動化された悪意のある要求を受け取りすぎることがあります。これは、DDoS攻撃、Webサイト管理パネルでパスワードを強制しようとする試み、またはソフトウェアの既知の脆弱性を悪用して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
手順1と2で変更した後、次のように 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;}...
2つの新しい部分を追加します。1つは server
ブロックの前、もう1つはその中にあります。
server
ブロックの前の部分は、新しい map
ブロックです。これは、デフォルトのアクション(アクセスは許可されません)と、Webサイトへのアクセスを許可される国/地域コードのリストを定義します。 map
の結果がそうである場合、 server
ブロック内の部分はウェブサイトへのアクセスを拒否します。
...
# 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){return444;}
# Old website redirect
if($new_uri){
rewrite ^ $new_uri permanent;}...
ファイルを保存して閉じ、終了します。
ここでは、プレースホルダーとして country_code_1
と country_code_2
を使用します。これらの変数を、ホワイトリストに登録する国の2文字の国コードに置き換えます。 [ISOのすべての国/地域コードの完全な検索可能なリスト](https://www.iso.org/obp/ui/#search)を使用して見つけることができます。たとえば、米国の2文字のコードは US
です。
最初の例とは異なり、この map
ブロックでは、 $ allowed_country
変数は常に特定の値に設定されます。デフォルトでは、「no」に設定されています。「$ geoip_country_code」変数がブロック内の特定の国コードと一致する場合は、「yes」に設定されます。 $ allowed_country
変数が no
の場合、実際のWebサイトにサービスを提供する代わりに、** 444 Connection Closed Without Response **を返します。
新しい構成を有効にするには、Nginxを再起動します。
sudo systemctl restart nginx
国/地域をホワイトリストに追加しなかった場合、 http:// your_server_ip
にアクセスしようとすると、ページが無効ですまたはページがデータを送信しませんなどのエラーメッセージが表示されます。 。国をホワイトリストに追加すると、以前と同じようにホームが表示されます。
これは、マップモジュールの使用方法の非常に単純な例かもしれませんが、他の多くの異なる方法で使用できるメカニズムを示しています。マップモジュールは、単純な比較を可能にするだけでなく、より複雑なマッチングを可能にする通常の式もサポートします。複数の条件を評価する必要がある場合、これはプロファイルを明確にするための良い方法です。
マップモジュールのもう1つの非常に一般的な使用例は、非SSL環境でWebサイトの安全な部分を条件付きでリダイレクトすることです。パスワード入力が必要なフォームにのみ必須のSSL接続を設定することは良い例です。実際のシナリオでマップモジュールを適用する方法は、この設定を試すことをお勧めします。
より詳細な情報は、Nginx](http://nginx.org/en/docs/http/ngx_http_map_module.html)の公式マップモジュールドキュメントにあります。
Nginxのマップモジュールの使用に関する関連チュートリアルの詳細については、[Tencent Cloud + Community](https://cloud.tencent.com/developer?from=10680)にアクセスして詳細を確認してください。
参照:「Ubuntu16.04でNginxのマップモジュールを使用する方法」
Recommended Posts