こんにちは 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 に飛ばすのが良いかと思います。
他にも役に立つノウハウ等ありましたら、ぜひ教えてください。