Cosminexus V9 アプリケーションサーバ Cosminexus HTTP Server

[目次][用語][索引][前へ][次へ]

4.7 リバースプロキシの設定

直接インターネットに接続できないクライアントからのリクエストをクライアントに代わってWebサーバに送信する代行サーバをプロキシサーバといいます。通常,プロキシサーバは,クライアントとインターネットとの接点に設置されます。これに対し,インターネットとWebサーバとの接点にプロキシサーバを設置した場合をリバースプロキシといいます。リバースプロキシでは,クライアントからのリクエストをWebサーバに代わってプロキシサーバが処理します。

通常のプロキシサーバとリバースプロキシの相違を次に示します。

図4-7 通常のプロキシサーバとリバースプロキシの相違

[図データ]

リバースプロキシを使用してできることを次に示します。

<この節の構成>
(1) プロキシモジュールの組み込み
(2) ディレクティブの設定方法
(3) システム構築例
(4) 注意事項

(1) プロキシモジュールの組み込み

リバースプロキシを使用するためにはプロキシモジュールの組み込みが必要です。プロキシモジュールを組み込むにはコンフィグファイル(httpsd.conf)に次に示すディレクティブを指定します。プロキシモジュールを組み込むには,コンフィグファイル(httpsd.conf)に次に示すディレクティブを指定します。UNIX版の場合は,必ず次に示す順序でLoadModuleディレクティブを指定してください。

(2) ディレクティブの設定方法

リバースプロキシを設定する各ディレクティブの設定例を次に示します。

ここでは各アドレスを次のように仮定しています。

リバースプロキシ:www.example.com

バックエンドサーバ:backend.example.com

(a) リクエストURLの再割り当ておよびリクエストヘッダの再割り当て

次のようにProxyPassディレクティブを設定すると,クライアントからの"http://www.example.com/news/oct-2001"というリクエストは"http://backend.example.com/oct-2001"というリクエストに変更されます。

 
ProxyPass /news/ http://backend.example.com/
 

Host:ヘッダは"Host:www.example.com"から"Host:backend.example.com"に再割り当てします。そして,リバースプロキシはバックエンドサーバからのレスポンスをクライアントに応答します。

(b) 応答ヘッダの再割り当て

Redirectディレクティブの指定,イメージマップの利用または末尾を/(スラッシュ)で閉じないディレクトリ指定のリクエストなど,バックエンドサーバでリダイレクトが指示された場合には,バックエンドサーバからのレスポンスのLocationヘッダにバックエンドサーバのアドレスが記載されます。これをそのままクライアントに応答すると,クライアントはリダイレクトをリバースプロキシではなく,直接バックエンドサーバにリクエストします。そこで,ProxyPassReverseディレクティブに次のように指定し,リダイレクトリクエストもリバースプロキシを通るリクエストになるようにします。

 
ProxyPassReverse /news/ http://backend.example.com/
 

これで,Locationヘッダはリバースプロキシのアドレスに変更されます。

(c) Set-Cookieヘッダの再割り当て

バックエンドサーバがクライアントに返すSet-Cookieヘッダには,ドメイン名およびパス名が指定される場合があります。これは,Set-Cookieヘッダのドメイン名およびパス名に一致したリクエストの場合だけ,クライアントにクッキーを送信させるためです。

Set-Cookieヘッダの再割り当てをしない場合と再割り当てをする場合について説明します。

(3) システム構築例

リバースプロキシとバックエンドサーバにHTTP Serverを使用してシステムを構築する場合の設定例を次に示します。

システムの構築時には,リダイレクト処理に注意して設定する必要があります。バックエンドサーバ上のディレクトリに対し,URLの最後に/ (スラッシュ)を付けないでアクセスした場合,バックエンドサーバはLocationヘッダを付加したリダイレクト要求を返信します。このとき,Locationヘッダの値をバックエンドサーバのアドレスからリバースプロキシのアドレスに変換し,クライアントの再要求先をリバースプロキシ経由に変更する必要があります。

ここでは,システムのネットワーク構成を図4-10のように仮定しています。また各アドレスを次のように仮定しています。

リバースプロキシ:www.example.com

バックエンドサーバ:backend.example.com

 

図4-10 ネットワーク構成

[図データ]

(a) 推奨する構成

ProxyPassディレクティブに指定するホスト名,パス名と,ProxyPassReverseディレクティブに指定するホスト名,パス名は同一の値としてください。また,バックエンドサーバ側のすべてのバーチャルホストでServerNameディレクティブを指定し,その値はリバースプロキシ側のProxyPassReverseディレクティブに設定したホスト名と同一にしてください。

図4-10に示すネットワーク構成で,リバースプロキシおよびバックエンドサーバの設定を表4-6のようにした場合のリダイレクト処理の流れは,表4-7のようになります。

表4-6 推奨する構成の設定例

設定場所 設定内容
リバースプロキシ ServerName www.example.com
ProxyPass /before/ http://backend.example.com/after/
ProxyPassReverse /before/ http://backend.example.com/after/
バックエンドサーバ ServerName backend.example.com

表4-7 推奨する構成でのリダイレクト処理の流れ

図中の位置 説明
1 "http://www.example.com/before/dir"にアクセスします。
2 ProxyPassディレクティブの値に従い,"http://backend.example.com/after/dir"にアクセスします。また,Hostヘッダの値をbackend.example.comに書き換えて転送します。
3 URLの末尾に /(スラッシュ)が付いていないため,URLの末尾に/ (スラッシュ) を付けたURLを作成し,それをLocationヘッダに設定してリダイレクト要求を返します。
4 ProxyPassReverseディレクティブの値に従い,Locationヘッダを"http://www.example.com/before/dir/"に書き換えて転送します。
5 Locationヘッダに従い,"http://www.example.com/before/dir/"に改めてアクセスします。
A Hostヘッダの値は"www.example.com"です。
B Hostヘッダの値は"backend.example.com"です。
C Locationヘッダの値は"http://backend.example.com/after/dir/"です。
D Locationヘッダの値は"http://www.example.com/before/dir/"です。

バックエンドサーバからの応答がステータスコード(302 Foundや404 Not Foundなど)になった場合,リバースプロキシはそのHTMLドキュメントをそのままクライアントに転送します。「404 Not Found」などのHTMLドキュメントに記載されるバックエンドサーバ名や,「302 Found」などに記載されるリダイレクト先のリンクアドレスはリバースプロキシの情報に変更されません。バックエンドサーバ側でErrorDocumentディレクティブを使用またはリバースプロキシ側でProxyErrorOverrideディレクティブを使用して,バックエンドサーバの情報をクライアントに見せないようにしてください。

(b) リバースプロキシ側でProxyPreserveHostディレクティブにOnを設定する構成

通常,リバースプロキシはクライアントから受信したHostヘッダの値をProxyPassディレクティブの値に従って変更し,バックエンドサーバに転送します。クライアントが送信したHostヘッダの値をバックエンドサーバ側でもHostヘッダの値として取得したい場合は,リバースプロキシ側でProxyPreserveHostディレクティブの値をOnに設定します。このとき,次の点に注意してください。

図4-10に示すネットワーク構成で,リバースプロキシおよびバックエンドサーバの設定を表4-8のようにした場合のリダイレクト処理の流れは表4-9のようになります。

表4-8 リバースプロキシ側でProxyPreserveHostにOnを設定する構成の設定例

設定場所 設定内容
リバースプロキシ ServerName www.example.com
ProxyPass /before/ http://backend.example.com/after/
ProxyPassReverse /before/ http://www.example.com/after/
ProxyPreserveHost On
バックエンドサーバ ServerName www.example.com

表4-9 リバースプロキシ側でProxyPreserveHostにOnを設定する構成でのリダイレクト処理の流れ

図中の位置 説明
1 "http://www.example.com/before/dir"にアクセスします。
2 ProxyPassディレクティブの値に従い,"http://backend.example.com/after/dir"にアクセスします。また,ProxyPreserveHostディレクティブの値がOnに設定されているため,Hostヘッダの値はwww.example.comのままです。
3 URLの末尾に /(スラッシュ)が付いていないため,URLの末尾に/ (スラッシュ) を付けたURLを作成し,それをLocationヘッダに設定してリダイレクト要求を返します。
4 ProxyPassReverseディレクティブの値に従い,Locationヘッダを"http://www.example.com/before/dir/"に書き換えて転送します。
5 Locationヘッダに従い,"http://www.example.com/before/dir/"に改めてアクセスします。
A Hostヘッダの値は"www.example.com"です。
B Hostヘッダの値は"www.example.com"です。
C Locationヘッダの値は"http://www.example.com/after/dir/"です。
D Locationヘッダの値は"http://www.example.com/before/dir/"です。

(4) 注意事項

(a) 基本的な注意事項
(b) ProxyPassディレクティブに関する注意事項
(c) ProxyPassReverseディレクティブに関する注意事項
(d) HWSProxyPassReverseCookieディレクティブに関する注意事項
(e) 性能に関する注意事項

ProxyPassディレクティブにドメイン名またはホスト名を指定している場合,DNSへの問い合わせが発生します。バックエンドサーバのIPアドレスがわかっている場合は,hostsファイルにあらかじめIPアドレスを記載しておくことによって,名前解決の時間を短縮できます。