unoh.github.com

mod_proxy_balancer 小技集

Sun Jul 09 18:52:38 -0700 2006

こんにちは sato です。
 ベンチャーでは高価なハードウェアバランサなどを購入することはできないですが、
 apache2.2 から mod_proxy_balancerという apacheモジュールの ソフトウェアバランサが
 追加されたので、フォト蔵でも使用しています。 
 
 今のところ proxy サーバがボトルネックになることはないです。

 想定構成は以下とし、apacheは 2.x を使用しました。
  proxy1
   +------web1
   +------web2 ...
   +------webN
 
・基本設定

httpd.conf

  LoadModule proxy_module modules/mod_proxy.so
  LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  ProxyPass / balancer://photoweb/ timeout=2
  <Proxy balancer://photoweb>
   BalancerMember http://web1.photozou.jp loadfactor=10 keepalive=On
   BalancerMember http://web2.photozou.jp loadfactor=10 keepalive=On ..
   BalancerMember http://webN.photozou.jp loadfactor=10 keepalive=On
  </Proxy>

 / にアクセスした際に、BalancerMember に proxyされ、応答のないサーバには自動的にバランスしなくなります。
 BalancerMember には IPアドレスや URLがつかえます。一般的には IPアドレス を指定したほうが
 高速ですが、フォト蔵ではIPアドレスは使用せず、すべて名前で指定しています。
 

・etag に関して
 etagの生成アルゴリズムはデフォルトで

 FileETag INode MTime Size 

 となっています。
 つまり web1 に画像を取りに行って ETag 値をもらっても web2にアクセスすると
 i-node値が異なるため、違うETag値が返ってしまうので、 304 になりません。
 
 そこで、web1, web2の httpd.conf に

 FileETag MTime Size

と記述すると
 ファイルの最終修正時刻とファイルサイズを見るようなるので、どちにアクセスしても304が返るようになります。

・アクセスログに関して
 web1,web2 は proxy1 からアクセスされるので ローカルネットの IPAdress が
 アクセスログに残ってしまいます。そこで web1,web2 に mod_rpaf を導入しましょう

 http://stderr.net/apache/rpaf/

 このモジュールをロードするとX-Forwarded-For を Host に上書きしてくれます。
 今回は mod_rpaf-0.5.tar.gz を使用しました。
 
 Makefile の APXS= の部分を適切な場所に書き換えて

 tar zxfv mod_rpaf-0.5.tar.gz
 make rpaf-2.0
 sudo make install-2.0

 httpd.confに

 LoadModule rpaf_module modules/mod_rpaf-2.0.so
 RPAFenable On
 RPAFsethostname Off
 RPAFproxy_ips 127.0.0.1 10.0.0.10

 RPAFproxy_ips に書き換える HOSTのIPアドレスを連続して書けるのですが、10.0.0. や 10.0.0.0/16
 などと書くことはできません。

 これは mod_rpaf-2.0.c の 123行目付近が strcmp(remote_ip, list[i]) == 0
 となっているのが原因なので。これを strstr や strncmp に変更すれば
 解決しそうです。

・SSLに関して
 最初は poundを使用するつもりでしたが、不安定になることがあったので
 proxy1ではmod_sslでSSLデコードしています。よって、ローカルネット内ではhttp でパケットが流れています。
 しかし web1 が http、httpsでどちらでリクエストが来たのかを知りたい場合があります。
 例えばログイン部分でHTTPS と HTTP のリンクを切り替えたりする場合です。

 そのような場合には

 httpd.confに

 RequestHeader set X-SSL-REQUEST %{HTTPS}s

 とつけてあげると、 X-SSL-REQUEST というヘッダが入ります。 %{HTTPS}s の部分は
 apacheがSSLだと on と加えてくれますので、web側ではこのヘッダを見るのが
 良いかと思います。
 X-SSL-REQUEST は自由に変更できるので、推測されにくい文字列の方がよいかもしれないですね

・Proxyする必要のあるものと無いもの
 静的な画像データなどは web にわざわざ取りに行かなくて proxyサーバに乗せておけば
 良いと思います。mod_rewrite で

 RewriteRule ^(css|img|js)/ - [L] 

 などとして、 /img などのファイルは そのまま document_root に飛ばすのが良いかと思います。

 他にも役に立つノウハウ等ありましたら、ぜひ教えてください。