Hitachi Web Server
直接インターネットに接続できないクライアントからのリクエストをクライアントに代わってWebサーバに送信する代行サーバをプロキシサーバといいます。通常,プロキシサーバは,クライアントとインターネットとの接点に設置されます。これに対し,インターネットとWebサーバとの接点にプロキシサーバを設置した場合をリバースプロキシといいます。リバースプロキシでは,クライアントからのリクエストをWebサーバに代わってプロキシサーバが処理します。
通常のプロキシサーバとリバースプロキシの相違を次に示します。
図4-7 通常のプロキシサーバとリバースプロキシの相違
リバースプロキシを使用してできることを次に示します。
リバースプロキシを使用するためにはプロキシモジュールの組み込みが必要です。プロキシモジュールを組み込むにはコンフィグファイル(httpsd.conf)に次に示すディレクティブを指定します。プロキシモジュールを組み込むには,コンフィグファイル(httpsd.conf)に次に示すディレクティブを指定します。UNIX版の場合は,必ず次に示す順序でLoadModuleディレクティブを指定してください。
LoadModule proxy_module libexec/mod_proxy.so LoadModule proxy_http_module libexec/mod_proxy_http.so |
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so |
リバースプロキシを設定する各ディレクティブの設定例を次に示します。
ここでは各アドレスを次のように仮定しています。
次のように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"に再割り当てします。そして,リバースプロキシはバックエンドサーバからのレスポンスをクライアントに応答します。
Redirectディレクティブの指定,イメージマップの利用または末尾を/(スラッシュ)で閉じないディレクトリ指定のリクエストなど,バックエンドサーバでリダイレクトが指示された場合には,バックエンドサーバからのレスポンスのLocationヘッダにバックエンドサーバのアドレスが記載されます。これをそのままクライアントに応答すると,クライアントはリダイレクトをリバースプロキシではなく,直接バックエンドサーバにリクエストします。そこで,ProxyPassReverseディレクティブに次のように指定し,リダイレクトリクエストもリバースプロキシを通るリクエストになるようにします。
ProxyPassReverse /news/ http://backend.example.com/ |
これで,Locationヘッダはリバースプロキシのアドレスに変更されます。
バックエンドサーバがクライアントに返すSet-Cookieヘッダには,ドメイン名およびパス名が指定される場合があります。これは,Set-Cookieヘッダのドメイン名およびパス名に一致したリクエストの場合だけ,クライアントにクッキーを送信させるためです。
Set-Cookieヘッダの再割り当てをしない場合と再割り当てをする場合について説明します。
バックエンドサーバが応答したドメイン名およびパス名を含むSet-Cookieヘッダをリバースプロキシがそのままクライアントに応答する例を次の図に示します。なお,図中の数字は,説明文の項番と対応しています。
図4-8 Set-Cookieヘッダの再割り当てをしない例
この場合,クライアントはリバースプロキシを経由する/front/cgi-bin/以下へのリクエストについて,Set-Cookieヘッダで受信したクッキーを送信しません。これは,クライアントが受信したSet-Cookieヘッダのドメイン名backend.example.comが,リバースプロキシのドメイン名www.example.comと異なるためです。また,パス名についても同様に適合しません。
バックエンドサーバがSet-Cookieヘッダで応答したクッキーをクライアントから受け取るためには, HWSProxyPassReverseCookieディレクティブの指定が必要です。HWSProxyPassReverseCookieディレクティブを指定してSet-Cookieヘッダの再割り当てをする例を次の図に示します。なお,図中の数字は,説明文の項番と対応しています。
図4-9 Set-Cookieヘッダの再割り当てをする例
この場合,クライアントはリクエストURLのパス部分/front/cgi-bin/test-cgi.plに対して,前方一致するパス名/front/cgi-bin/のSet-Cookieヘッダを受信します。また,クライアントが受信するSet-Cookieヘッダにはドメイン名が含まれていません。これは,クライアントがリクエストしたURLのドメイン名www.example.com がSet-Cookieヘッダに指定されている場合と同じ意味となります。したがって,リバースプロキシを経由したバックエンドサーバへのリクエストに,Set-Cookieヘッダで設定したクッキーを送信させることができます。
リバースプロキシとバックエンドサーバにHitachi Web Serverを使用してシステムを構築する場合の設定例を次に示します。
システムの構築時には,リダイレクト処理に注意して設定する必要があります。バックエンドサーバ上のディレクトリに対し,URLの最後に/ (スラッシュ)を付けないでアクセスした場合,バックエンドサーバはLocationヘッダを付加したリダイレクト要求を返信します。このとき,Locationヘッダの値をバックエンドサーバのアドレスからリバースプロキシのアドレスに変換し,クライアントの再要求先をリバースプロキシ経由に変更する必要があります。
ここでは,システムのネットワーク構成を図4-10のように仮定しています。また各アドレスを次のように仮定しています。
図4-10 ネットワーク構成
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/"です。 |
通常,リバースプロキシはクライアントから受信した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/"です。 |
ProxyPass / http://転送先バックエンドサーバアドレス/ |
表4-10 リンクの記述方法とリンク可否の関係
| リンクの記述 | リンクをクリックしたときのアクセス可否 |
|---|---|
| <A HREF="index2.html">リンク</A> | ○ |
| <A HREF="/before/index2.html">リンク</A> | ○ |
| <A HREF="http://リバースプロキシのアドレス/before/index2.html">リンク</A> | ○ |
| <A HREF="/after/index2.html">リンク</A> | × |
表4-11 ProxyPassディレクティブの指定とリクエストの関係
| ProxyPassディレクティブの指定例 | リクエスト | 適合可否 | リクエスト転送先 |
|---|---|---|---|
| ProxyPass /abc/ http://backend.example.com/ | http://リバースプロキシのアドレス/abc/ | ○ | http://backend.example.com/ |
| http://リバースプロキシのアドレス/abc | × | − | |
| http://リバースプロキシのアドレス/abc/def | ○ | http://backend.example.com/def | |
| ProxyPass /abc http://backend.example.com/ | http://リバースプロキシのアドレス/abc | ○ | http://backend.example.com/ |
| http://リバースプロキシのアドレス/abc/ | ○ | http://backend.example.com// | |
| http://リバースプロキシのアドレス/abc/def | ○ | http://backend.example.com//def |
ProxyPass /abc/def/ http://backend1.example.com/ ProxyPass /abc/ http://backend2.example.com/ ProxyPass / http://backend3.example.com/ |
ProxyPass /front/ http://backend.example.com/ HWSProxyPassReverseCookie /front/ |
表4-12 Set-Cookieヘッダの変換規則
| 項番 | クライアントに応答するSet-Cookieヘッダ | バックエンドサーバが応答するSet-Cookieヘッダ | 変換規則の説明 |
|---|---|---|---|
| 1 | Set-Cookie: 〜; path=/front/ | Set-Cookie: 〜; path=/ | バックエンドサーバが応答するSet-Cookieヘッダにドメイン名が指定されていない場合は,Set-Cookieヘッダのパス名/(スラッシュ)を/front/に置き換えます。 |
| 2 | Set-Cookie: 〜; path=/front/ | Set-Cookie: 〜; domain=backend.example.com; path=/ | バックエンドサーバが応答するSet-Cookieヘッダのドメイン名が,ProxyPassディレクティブで指定した転送先URLのドメイン名と完全に一致している場合は,Set-Cookieヘッダのパス名/(スラッシュ)を/front/に置き換えます。また,Set-Cookieヘッダのドメイン名を削除してクライアントに返します。 |
| 3 | Set-Cookie: 〜; domain=.example.com; path=/ | Set-Cookie: 〜; domain=.example.com; path=/ | バックエンドサーバが応答するSet-Cookieヘッダのドメイン名が,.(ピリオド)から始まるドメイン名である場合は,バックエンドサーバが応答したSet-Cookieヘッダをそのままクライアントに返します。 |
| 4 | Set-Cookie: 〜; domain=other.example.com; path=/ | Set-Cookie: 〜; domain=other.example.com; path=/ | バックエンドサーバが応答するSet-Cookieヘッダのドメイン名がProxyPassディレクティブで指定した転送先URLのドメイン名と異なる場合は,バックエンドサーバが応答したSet-Cookieヘッダをそのままクライアントに返します。 |
| 5 | Set-Cookie: 〜 | Set-Cookie: 〜 | バックエンドサーバが応答するSet-Cookieヘッダにドメイン名およびパス名が指定されていない場合は,バックエンドサーバが応答したSet-Cookieヘッダをそのままクライアントに返します。 |
ProxyPass /front/ http://backend.example.com/abc/def/ HWSProxyPassReverseCookie /front/ |
ProxyPassディレクティブにドメイン名またはホスト名を指定している場合,DNSへの問い合わせが発生します。バックエンドサーバのIPアドレスがわかっている場合は,hostsファイルにあらかじめIPアドレスを記載しておくことによって,名前解決の時間を短縮できます。
All Rights Reserved. Copyright (C) 2008, 2010 Hitachi, Ltd.