NGINX を使った HTTP Proxy の構築

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は NGINX で Reverse Proxy サーバ (HTTP Proxy) を構築してみました。(※以下の内容は NGINX 1.12.2 にて検証しています。)

■はじめに

さて、今回は NGINX を使った Reverse Proxy サーバのお話です。NGINX では、HTTP Proxy (ngx_http_* モジュール) と TCP/UDP Proxy (ngx_stream_* モジュール) を構築することが可能 (TCP/UDP Proxy はバージョン “1.9.0” 以降) です。今回の検証では以下のモジュールが主に関連します。

(ngx_http_core_module)

(ngx_http_upstream_module)

(ngx_http_proxy_module)

また、今回の検証では利用しませんが、TCP/UDP Proxy の処理に関連するモジュールとして以下の様なものがあります。

(ngx_stream_core_module)

(ngx_stream_upstream_module)

(ngx_stream_proxy_module)

■構成情報

それでは環境を構築してみます。今回は以下の様な環境を構築してみました。

上記の通り、2つのネットワーク (192.168.100.0/24, 192.168.200.0/24) を用意した上で、各ノードに以下の様な IP アドレスを設定し、client から直接 web サーバにはアクセスできないようにしています。(proxy サーバには 2つの NIC を用意し、両方のネットワークに接続できるようにしています。)

上記構成では、client から proxy サーバにリクエストを送信すると、バックエンドの web1 ~ web3 にリクエストが振り分けられ、いずれかの web サーバからレスポンスが返ってくることを想定しています。

それでは、上記構成を実現するための各 proxy, web サーバの設定について見ていきます。(※各ディレクティブの詳細等は割愛していますので、前述したドキュメントも併せてご参照下さい。)

初めに各 proxy, web サーバ共通の設定です。各サーバには以下の様な共通の設定ファイル nginx.conf (/usr/local/nginx/conf/nginx.conf) を配置します。

この nginx.conf では、エラーログやアクセスログ等の基本的な設定を行なっています。そして、include ディレクティブにて /usr/local/nginx/conf.d/ 配下にある *.conf ファイルを読み込むように設定しています。

次に、各 proxy, web サーバ毎に異なる設定を行います。このサーバ毎に異なる設定を行う設定ファイルは、前述した /usr/local/nginx/conf.d/ 配下の *.conf ファイルとして作成し、共通設定を行なっている nginx.conf から読み込まれるようにします。

まずは proxy サーバの設定です。proxy サーバには以下の様な設定ファイルを配置します。

はじめに、upstream ディレクティブにて任意の名前 (backend) を付けたグループを作成しています。グループ内に登録するサーバは upstream コンテキスト内の server ディレクティブで指定します。(※少しややこしいのですが、後述する server ディレクティブとは異なる server ディレクティブです。)

今回はバックエンドのサーバである web1 ~ web3 を upstream コンテキスト内の server ディレクティブに指定しています。(upstream コンテキスト内の server ディレクティブには、FQDN や IP アドレスを指定することが可能です。)

また、server ディレクティブによるバックエンドサーバの指定では、リクエストを転送する先 (web サーバ) の port 番号 “80” を明示的に指定しています。この記載を省略すると、デフォルトで 80 番 port が利用されます。

次に、server ディレクティブ (upstream コンテキスト内の server ディレクティブとは異なる server ディレクティブ) にて proxy サーバがリクエストを受け取るための設定 (listen) 及びバックエンドサーバにリクエスト転送する設定 (proxy_pass) を行います。

listen ディレクティブでは proxy サーバがクライアントからリクエストを受け付ける IP アドレス及び port 番号 (ソケット) を指定します。

proxy_pass ディレクティブではリクエストを転送する設定を行いますが、今回は upstream ディレクティブにて設定したグループ “backend” を転送先に指定するため、http:// の後ろに “backend” を指定しています。

次に、各 web サーバ側の設定です。各 web サーバには以下の様な設定ファイルをそれぞれ配置します。各 web サーバは “/” 宛のリクエストに対して “/usr/local/nginx/html” 配下の index1.html ~ index3.html を返すだけのシンプルな設定にしています。

また、各 index*.html の中身は以下の様になっており、どの web サーバからのレスポンスであるかが分かるようにしてあります。

各サーバの設定については以上です。

■検証

では、前述した設定の環境で実際に動作を確認してみます。

初めに proxy サーバ上から web1 ~ web3 サーバにリクエストを送信してみます。

すると、上記の通り各 web サーバからレスポンスが返ってくることが確認できます。前述した通り、レスポンスの内容から、どの web サーバからのレスポンスであるかが確認できます。

次に、client から各 web サーバに対して直接リクエストを送信してみます。

上記の通り、client と各 web サーバは別のネットワークセグメントに配置されているため、直接リクエストを送信できないことが確認できます。

最後に、client から proxy サーバに対してリクエストを送信してみます。

すると、同一の URL リクエスト (Reverse Proxy として動作しているサーバ “proxy” 宛のリクエスト) に対して、web1, web2, web3 からのレスポンスが返ってきていることが確認できます。

さらに、20回ほど連続でリクエストを送信してみます。

すると、上記の通り upstream ディレクティブで設定した 3台の web サーバから順にレスポンスが返ってきており、Reverse Proxy として動作してる NGINX が 3台の web サーバにリクエストを振り分けていることが確認できました。

■最後に

今回はシンプルな構成で NGINX を使った HTTP Proxy を構築してみました。HTTP Proxy の場合、NGINX サーバ上でリクエスト/レスポンスのヘッダを追加/修正することも可能ですので、次の機会に検証してみようと思います。また、TCP/UDP Proxy についても別の機会に検証してみたいと思います。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*