プロキシサーバー(フォワードプロキシ)はクライアントからのリクエストを代行してサーバーにリクエストします。 リバースプロキシとはこれとは逆にサーバー側にきたリクエストを別のサーバーに全て中継します。 用途としては1つのIPアドレスで複数のドメインを運用するときなどに使います。 もちろん、この場合virtualhostでも運用が可能ですが、サーバー処理を分散させる場合などはこの構成のほうがよいでしょう。
下表のような構成の場合、下図のようになります。
リバースプロキシ | グローバルIP:XXX.XXX.XXX.XXX ローカルIP:192.168.4.1 ドメイン:www.hoge.comとwww.hoge2.comの2つ |
---|---|
Webサーバー1 (バックエンドサーバー1) |
ローカルIP:192.168.5.1 処理するドメイン:www.hoge.com |
Webサーバー2 (バックエンドサーバー1) |
ローカルIP:192.168.5.2 処理するドメイン:www.hoge2.com |
リバースプロキシをhttpdで実装するには以下のモジュールが必要となります。
ProxyPassディレクティブで代行するパスと代行先のWEBサーバーを関連付けます。イメージ的にはサーバーのパスを別のサーバーのパスに置換する感じです。
バックエンドのWEBサーバー(上図だと192.168.5.1や2)が処理するHTTP-HOST(自身のホスト名)はProxyPassで指定したものになるので、 ServerNameによるVirtualHostの運用ができなくなります。 (例えばwww.hoge.com, www1.hoge.comそれぞれ別のページを表示したくても、ServerNameが全て192.168.5.1となってしまうので名前による運用ができない。) これを解決するにはProxyPreserveHost Onの設定が必要となります。
<VirtualHost *:80>
ServerName hoge.com
ServerAlias *.hoge.com
ProxyPreserveHost On
ProxyPass / http://192.168.5.1/
</VirtualHost>
ProxyPreserveHostディレクティブをOnに設定することにより、"HTTP-HOST"が"HTTP-X-FORWARDED-HOST"に書き換わります。
バックエンドのWEBサーバー(上図だと192.168.5.1や2)が取得するリモートIPはクライアントのIPではなくリバースプロキシサーバーのIP(上図だと192.168.4.1)となります。 (ProxyPreserveHostディレクティブをOnに設定してもリモートIPは変わりません。もちろん、delegate等のプロキシーソフトも同様です。) よって、以下の問題が生じます。
ここ問題を解決してくれるのがmod_extract_forwardedです。このモジュールはリモートIPを"X-Forwarded-For"のIPアドレスに書き換えてくれます。平たく言うと、リモートIPを本来のクライアントのIPアドレスに書き換えてくれます。 これはバックエンドのWebサーバーにインストールしてください。 なお、このモジュールはソースでしか公開されていなので、apxsを使ったコンパイルが必要です。apxsがインストールされていない場合は「Apache HTTPの基礎」の「httpdのインストール」を参考にしてください。
mod_extract_forwardedのインストールは以下の通りです。必要なモジュールのダウンロード方法も書いてあります。 (参考:mod_rpaf のかわりに mod_extract_forwarded...)
# The following modules are not loaded by default:
#
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule asis_module modules/mod_asis.so
LoadModule extract_forwarded_module /usr/lib/httpd/modules/mod_extract_forwarded.so
.
.
.
DocumentRoot "/var/www/html"
MEForder refuse,accept #refuse,acceptの順
MEFrefuse all #全て拒絶
MEFaccept 192.168.4.1 #リバースプロキシサーバーのIP
ちなみに青字部分はapxsが正常に終了すると自動で書かれるはずですが、ない場合は記入してください。
ロードバランサーを使用している場合やtomcatへ転送したい場合など、503エラー(server temporarily unavailable)が表示されることがあります。 これはTCP(ポート番号を使うなど)を使った転送になるため、SELinuxが有効の場合デフォルトでは許可され待ていません。 よって、許可する場合は以下のようにhttpd_can_network_connectを有効にする必要があります。
[root ~]setsebool -P httpd_can_network_connect
COPYRIGHT © 2008 Deepnet Inc. ALL RIGHTS RESERVED.