Ubuntu16.04でNginxのマップモジュールを使用する方法

前書き ##

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

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

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

準備 ##

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

ステップ1-サンプル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モジュールを使用して、ビューアを新しい置換に自動的にリダイレクトすることにより、この古いアドレスが再び機能することを確認します。

ステップ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ブロックであり、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つは、次のステップで、訪問者の地理的な場所に基づいてトラフィックをフィルタリングする方法について説明します。

ステップ3-特定の国/地域へのWebサイトアクセスを制限する

場合によっては、サーバーが自動化された悪意のある要求を受け取りすぎることがあります。これは、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

Ubuntu16.04でNginxのマップモジュールを使用する方法
Ubuntu16.04でSambaサーバーを使用する方法
Ubuntu20.04にDockerをインストールして使用する方法
Ubuntu18.04にCurlをインストールして使用する方法
Ubuntu18.04にComposerをインストールして使用する方法
Ubuntu18.04にWineをインストールして使用する方法
Ubuntu14.04でDockerデータボリュームを使用する方法
Ubuntu20.04にComposerをインストールして使用する方法
Ubuntu14.04にBaasBoxをインストールして使用する方法
Jenkinsを使用してUbuntuで自動的にビルドする方法
Ubuntu16.04にPostgreSQLをインストールして使用する方法
Ubuntu16.04のNginxにロギングモジュールを追加する方法
Ubuntu16.04にDockerをインストールして使用する方法
LVMを使用してUbuntu18.04でストレージデバイスを管理する方法
Ubuntu14.04のNginxにgzipモジュールを追加する方法
Ubuntu18.04にMySQLWorkbenchをインストールして使用する方法
Ubuntu20.04にRubyをインストールする方法
Ubuntu20.04にJavaをインストールする方法
ubuntuでhanlpを使用する方法
Ubuntu20.04にVirtualBoxをインストールする方法
Ubuntu20.04にElasticsearchをインストールする方法
UbuntuにProtobuf3をインストールするための詳細なチュートリアル
Ubuntu20.04にNginxをインストールする方法
Ubuntu20.04にApacheをインストールする方法
Ubuntu20.04にGitをインストールする方法
Ubuntu16.04にNode.jsをインストールする方法
Ubuntu20.04にVagrantをインストールする方法
Ubuntu14.04にBacula-Webをインストールする方法
Ubuntu16.04にPostgreSQLをインストールする方法
Ubuntu20.04にGitをインストールする方法
Ubuntu18.04にAnaconda3をインストールする方法
Ubuntu18.04にMemcachedをインストールする方法
Ubuntu16.04にJenkinsをインストールする方法
Ubuntu14.04にMemSQLをインストールする方法
Ubuntu20.04にGoをインストールする方法
Ubuntu16.04にMongoDBをインストールする方法
Ubuntu14.04にMailpileをインストールする方法
Ubuntu16.04にPrestaShopをインストールする方法
Ubuntu14.04でPHP7にアップグレードする方法
Ubuntu20.04にSkypeをインストールする方法
Ubuntu20.04にJenkinsをインストールする方法
Ubuntu18.04にPython3.8をインストールする方法
Ubuntu18.04にKVMをインストールする方法
Ubuntu20.04にKVMをインストールする方法
ubuntu14.04にopencv3.0.0をインストールする方法
Ubuntu20.04にAnacondaをインストールする方法
Ubuntu16.04にPrometheusをインストールする方法
Ubuntu18.04にJenkinsをインストールする方法
Ubuntu14.04にDjangoをデプロイする方法
Ubuntu20.04にApacheをインストールする方法
Ubuntu20.04にRをインストールする方法
Ubuntu16.04にMoodleをインストールする方法
Ubuntu14.04にSolr5.2.1をインストールする方法
Ubuntu16.04にTeamviewerをインストールする方法
Ubuntu14.04でNginxを保護する方法
Ubuntu20.04にMariaDBをインストールする方法
Ubuntu20.04にNginxをインストールする方法
Ubuntu20.04にMonoをインストールする方法
Ubuntu20.04にGoをインストールする方法
Ubuntu20.04にZoomをインストールする方法
Ubuntuでソフトウェアをアンインストールする方法