もっと詳しく

プライベートネットワークでのみアクセス可能なWebアプリケーションを作成することを計画していますか? NGINX ProxyPass(proxy_pass)を使用してNGINXをリバースプロキシサーバーとして設定してみませんか?

NGINXのngx_http_proxy_moduleのproxy_passディレクティブを使用すると、プライバシー管理を維持しながらWebアプリケーションを世界に公開するようにNGINXを構成できます。 また、このチュートリアルでは、アプリケーションのプライバシーとパフォーマンスの向上を定義するためのさまざまな構成について学習します。

NGINX ProxyPassを読んで、Webアプリケーションを安全に保ちましょう!

前提条件

このチュートリアルは、実践的なデモンストレーションになります。 フォローしたい場合は、次のものがあることを確認してください。

  • Linuxサーバー–このチュートリアルではUbuntu20.04LTSを使用します。
  • NGINX およびDockerがLinuxマシンにインストールされ、実行されています。
  • 127.0.0.1:8000で実行されているWebアプリケーション。

NGINX ProxyPassまたはリバースプロキシサーバーとは何ですか?

NGINX proxy_passを深く掘り下げる前に、まずリバースプロキシサーバーとは何かを見てください。 リバースプロキシサーバーは、Webアプリケーションに追加のセキュリティレイヤーを提供します。

さらに、リバースプロキシサーバーは負荷分散に使用され、異なるサーバーにまたがるサーバーアプリケーションに単一の面を提供します。

リバースプロキシサーバーは、クライアントの要求をリッスンし、関連するWebアプリケーションに要求を転送または中継する一種のサーバーです。 同時に、Webアプリケーションの応答でクライアントに応答します。

NGINXサーバーをリバースプロキシサーバーとして構成する

デフォルトでは、NGINXは静的コンテンツWebサーバーとして機能するため、NGINXの構成ファイルを編集して、NGINXをリバースプロキシサーバーとして構成します。 Linuxサーバーのオペレーティングシステムとそのディストリビューションに応じて、NGINXの構成ファイルは次のいずれかの場所にあります。

  • / etc / nginx
  • / usr / local / nginx / conf
  • / usr / local / etc / nginx

ただし、このチュートリアルではUbuntuを使用しているため、次の場所にある構成ファイルで作業します。 / etc / nginx ディレクトリ:

1.次のコマンドを実行して、作業ディレクトリ(cd)を/ etc / nginxディレクトリに変更し、作業ディレクトリ内のすべてのファイルとディレクトリ(ls)を一覧表示します。

以下に、NGINX構成のベースファイルであるnginx.confファイルを示します。

2.次に、以下のrmコマンドを実行します。このコマンドは出力を提供しませんが、sites-available/defaultファイルを削除します。

sudo rm sites-available/default

3.お好みのテキストエディタでsites-available/defaultファイルと呼ばれる新しいファイルを作成します。

sudo nano sites-available/default

4.次に、以下の構成をに追加します。 サイト-利用可能/デフォルト ファイルを作成し、変更を保存してエディターを閉じます。 次のサーバーブロック( サーバーディレクティブ)には、仮想ホストの構成全体が含まれます。

以下のディレクティブは構成を制御します。

  • listen - This directive specifies which port a particular server block should listen to for requests.
  • access_log and error_log - These directives specify the path for a server block to write access and error logs.
  • location –このディレクティブは、要求のURIに応じて構成を指定します。 以下の構成では、サーバーブロックへのすべての要求はproxy_passによって処理されます。
  • proxy_pass –このディレクティブは、プロキシサーバーのアドレスを指定します。 以下の構成は、http://127.0.0.1:8000のプロキシされたアプリケーションにすべてのリクエストを渡すようにNGINXに指示します。
server {
    # The listen directive serves content based on the port defined
    listen 80; # For IPv4 addresses
    listen [::]:80; # For IPv6 addresses

    # Replace the below if you have a domain name pointed to the server
    server_name your-domain.com;

    access_log /var/log/nginx/reverse-access.log;
    error_log /var/log/nginx/reverse-error.log;

    location / {
				# Specify the proxied server's address
        proxy_pass http://127.0.0.1:8000>;
    }
}

NGINXサーバーは、サーバーブロックを使用して複数のアプリケーションにサービスを提供できることに注意してください。

5.次のコマンドを実行して、NGINX構成をテスト(-t)します。

NGINX構成のテスト
NGINX構成のテスト

6.次に、以下のsystemctlコマンドを実行してNGINXサービスを再起動し、新しい構成を有効にします。

sudo systemctl restart nginx

構成にエラーがある場合、NGINXサービスは再起動しません。 代わりに、ログを見つける方法の説明が表示されます。 ubuntuでは、journalctl-xeコマンドを実行しているログを確認できます。

7.最後に、Webサーバーのドメイン名またはIPアドレスに移動して、以下に示すNGINXリバースプロキシサーバーを介してアプリケーションにアクセスします。

NGINXリバースプロキシサーバーを介したWebアプリケーションへのアクセス
NGINXリバースプロキシサーバーを介したWebアプリケーションへのアクセス

プロキシされたリクエストを処理するためのヘッダーの受け渡し

proxy_passとは別に、NGINXは、サーバーブロックへのリクエストを処理するための他の多くのディレクティブを提供します。 これらのディレクティブの1つは proxy_set_header、プロキシされたリクエストを処理するためにヘッダーを渡す/書き換えることができます。

このチュートリアルではすべてのヘッダーを網羅することはできませんが、最も一般的なヘッダー(Host、X-Forwarded-For、およびX-Real-IP)のいくつかについて説明します。

1.サーバーブロックの場所の下にあるproxy_passの上に次のステートメントを追加して、 サイト-利用可能/デフォルト ファイル。 Hostヘッダーは、アクセスしようとしているアプリケーションドメイン名を使用してHTTPクライアント/ブラウザーによって送信されます。

proxy_set_header Host $host;

デフォルトでは、NGINXはホストヘッダーをプロキシされたサーバーのアドレスに書き換えます ($ host) Hostヘッダーをプロキシサーバーに渡す前。 $ host変数は、元のリクエストのHostヘッダーまたはサーバーブロックのserver_name値の値を保持するNGINXによって設定されます。

プロキシされたアプリケーションがリクエストを受信すると、Hostヘッダーはhttp://127.0.0.1:8000に設定されます。 基本的に、NGINXはHostヘッダーをプロキシサーバーのドメイン名/IPアドレスに設定します。 この動作により、アプリケーションは、127.0.0.1からではなく、指定されたアドレスからアクセスされていることがわかります。

2.次に、以下のステートメントをに追加します。 サイト-利用可能/デフォルト 手順1で行ったようにファイルします。

アプリケーションは、X-Forwarded-Forヘッダーを使用して、アプリケーションにアクセスしようとしているクライアントのIPアドレスを識別します。 このヘッダーは、アプリケーションに到達するための要求に使用されるプロキシサーバーを識別します。

以下、 $ proxy_add_x_forwarded_for 変数は、リクエストのX-Forwarded-Forヘッダーの値とクライアントのIPアドレスを保持します。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3.以下の最後のステートメントを サイト-利用可能/デフォルト ファイル。

Webアプリケーションは、$ remote_addr変数に設定されたX-Real-IPヘッダーを使用して、サーバーにアクセスするHTTPクライアントのIPアドレスを保持します。

proxy_set_header X-Real-IP $remote_addr;

前の手順でリバースプロキシサーバーに使用される一般的な構成を適用すると、以下の完全な構成が得られます。

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

    # Replace the below if you have a domain name pointed to the server
    server_name your-domain.com;

    access_log /var/log/nginx/reverse-access.log;
    error_log /var/log/nginx/reverse-error.log;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass <http://127.0.0.1:8000>;
    }
}

4.次に、以下のsystemctlコマンドを実行します。このコマンドは出力を提供しませんが、NGINXサービスを再起動します。

sudo systemctl restart nginx

5.最後に、新しい構成を使用してブラウザーでWebアプリケーションにアクセスしてみてください。 すべてがうまくいけば、以下の出力が表示されます。

さまざまな構成でWebアプリケーションにアクセスできることを確認する
さまざまな構成でWebアプリケーションにアクセスできることを確認する

リダイレクト応答の送信

アプリケーションが次のようなLocationヘッダーを使用してリダイレクト応答を送信するとします。 場所:。 あなたはそれを見ることができます 127.0.0.1 アドレスは、アクセスされているものについて説明的ではありません。 だからあなたはそれを修正できますか? はい!

次のproxy_redirectディレクティブのいずれかをロケーションブロック内に追加します。 サイト-利用可能/デフォルト ファイル。 このディレクティブは、プロキシされたアプリケーションによって送信されたLocationヘッダーまたはRefreshヘッダーを、アプリケーションへのアクセスに使用されている実際のURLに書き換えます。

proxy_redirect <http://127.0.0.1/user/edit/3>  <http://your-domain.com/user/edit/3>;
# For changing all URLs, you can use the one below
proxy_redirect <http://127.0.0.1/>  <http://your-domain.com/>;

ヘッダーの非表示と許可

NGINXは、デフォルトで、プロキシされたアプリケーションによってクライアントに送信された一部のヘッダーを非表示にします。 ただし、proxy_hide_headerディレクティブを使用すると、NGINXにさらにヘッダーを非表示にするように指示できます。

以下のディレクティブをのロケーションブロックに追加します サイト-利用可能/デフォルト HTTPクライアントに送信される応答からヘッダーを自動的に非表示にするファイル。

ヘッダーを非表示にすると、悪意のある攻撃者によるアプリとアプリヘッダーの機密情報の悪用を防ぐことができます。

proxy_hide_header Cache-Control;

または、他の方法では非表示になっているヘッダーをクライアントに送信することを許可したい場合もあります。 もしそうなら、あなたは使用することができます proxy_pass_header 以下のようなディレクティブ。

NGINXロードバランシングによるパフォーマンスの向上

負荷分散は、サーバーの強力な構成です。 NGINXのアップストリームディレクティブは、アプリケーションの負荷を分散してアプリケーションのパフォーマンスを向上させるのに役立ちます。 同時に、アップストリームディレクティブはアプリケーションをスケーラブルにします。

NGINXサーバーを負荷分散用に構成するには:

1.テキストエディタを使用してNGINX構成フォルダ(/etc/nginx/conf.d/)内に新しいファイルを作成し、そのファイルにload-balancer.confという名前を付けます。

sudo nano /etc/nginx/conf.d/load-balancer.conf

2.次に、以下の構成をに追加します。 load-balancer.conf ファイル、変更を保存し、ファイルを閉じます。

あなたはそれを見ることができます アップストリームディレクティブ 負荷分散用のWebサーバークラスターまたはルーティング/負荷分散用のアプリサーバークラスターのいずれかを定義します。

http {
   upstream your-domain.com {
        server backend1.your-domain.com:443;
        server backend2.your-domain.com:443;
   }

   server {
      listen 80; 

      location / {
         proxy_pass https://your-domain.com;
      }
   }
}

3.以下のrmコマンドを実行します。このコマンドは出力を提供しませんが、サイトが有効なディレクトリからデフォルトのシンボリックリンク(symlink)を削除します。

sudo rm /etc/nginx/sites-enabled/default

4.最後に、NGINXサービスを再起動して、新しい構成を有効にします。

sudo systemctl restart nginx

構成でエラーが発生した場合は、load-balancer.confファイルを開き、構成が正しく記述されているかどうかを再確認してください。

Webアプリケーションが負荷分散で機能することを確認する
Webアプリケーションが負荷分散で機能することを確認する

結論

このチュートリアルを通じて、リバースプロキシサーバーがNGINXProxyPassで使用される理由と場所を学習しました。 いくつかのディレクティブとヘッダーを使用してリクエストを処理し、Webアプリケーションのプライバシーを制御することに触れました。

負荷分散とヘッダーの非表示は、Webアプリケーションのパフォーマンスとセキュリティに役立ちます。 しかし、セキュリティの別の層を追加するのは素晴らしいことではないでしょうか? なぜだめですか NGINXをアクティブにして、HTTPをHTTPSトラフィックにリダイレクトします

The post NGINXProxypassを使用したリバースプロキシサーバーのセットアップ appeared first on Gamingsym Japan.