3.Rewriteモジュール

前ページのような形で画像等をミラーするサーバーを複数用意出来たら、あとはクライアントから動画や画像ファイルに対してリクエストがあったときに、それを適切な方法でいずれかのミラーに振り分ければ良いことになる。PerlなどCGIを用いて何らかの条件で毎回振り分け先を決める方法もあるが、リクエストがある度にCGIを呼び出していたのでは、少なからぬオーバーヘッドが生じて効率が悪く、アクセス数が多いと転送量よりも、サーバー負荷が問題となってしまう恐れがある。

そこでApacheの便利なモジュール、Rewriteモジュール(mod_rewrite)の登場である。これはクラインアントからリクエストされたURLのパス部分を内部的に書き換えたり、条件に応じて他へリダイレクトしたりすることを、柔軟におこなうことが出来る非常に強力で便利なモジュールであり、使用のオーバーヘッドも少ない。

具体的な設定方法をみてみよう。以下のようにファイルが配置されている場合を考える。親サーバーのindex.html内ではimages内に置かれた画像等のファイルを参照している。

サーバーファイル配置図
図.ファイルの配置

これで、親サーバーに対してimagesフォルダ内のファイルへのリクエストがあった場合に、Rewriteモジュールのリダイレクトを使用してそれらを全てミラー(の一つ)に振り分けることにしよう。Rewriteモジュールを有効化にするには、親サーバーに置いた.htaccessファイルに必要なディレクティブを記述する。振り分けの条件は色々な基準があるが、ここでは単純にクライアントのIPアドレスの末尾の数字の偶奇で振り分けることにする。

# .htaccessファイル

# 1.Rewriteエンジンの有効化
RewriteEngine On

# 2.書き換え基準のパス設定
RewriteBase /

# 3.リダイレクトの条件設定 # (1)IPアドレスの末尾が奇数の場合はMirror1へリダイレクト RewriteCond %{REMOTE_ADDR} (1|3|5|7|9)$ RewriteRule images/(.*) http://child-server.subdomain.ne.jp/images/$1 [R,L]
# (2)上記に合致しないものはMirror2へリダイレクト RewriteRule images/(.*) http://www.subdomain.jp/~cluster/images/$1 [R,L]

*RewriteRuleの末尾の[R]はリダイレクト、[L]は合致した場合にそこで判定を終えるためのオプション
*RewriteMapディレクティブを用いるとより複雑な条件設定が可能であるが、余計なオーバーヘッドを生じさせたくないため、その方法についてはここでは触れない。

上記のような.htaccessファイルを作成し親サーバーにアップロードすればWebクラスターシステムの設定・構築は早くも全て完了である。これで親サーバーに対してhttp://www.parent-server.co.jp/images/hoge.jpgを要求すると、"302 MOVED TEMPORARILY"のレスポンスと、IPに応じて以下のいずれかのURLが返されてリダイレクトされ、アクセスしてきたクライアントは実際のファイルをミラーの一つから取得・ダウンロードすることになる。

http://child-server.subdomain.ne.jp/images/hoge.jpg
http://www.subdomain.jp/~cluster/images/hoge.jpg

このため、容量の大きなファイルは全てミラーサーバーからクライアントへ送られることになり、親サーバーの転送量は低く抑えることが可能で、目的とする転送量分散クラスタが実現できていることが分かる。

リダイレクトされる場合でもクライアントから親サーバーに対して一度リクエストが送信され、それを処理することがオーバーヘッドを生じさせるように思われるかも知れないが、これは実際に同一サーバーに画像を置き、それをダウンロードするために帯域とリソースを占有することによるサーバー負荷と比較すると、無視できるほど小さく、ほとんど気にする必要はない。

この方法の利点は親サーバーのHTMLコード(<img src="images/hoge.jpg">等)を一切書き換える必要がなく、転送がすべて自動的に行われる点である。このため、サイト管理者は画像等が同一サーバーに置かれているように扱いコンテンツ開発を行うことが出来、また、クライアントも同じURLでアクセス出来るので全く気にすることなくミラーへの移行が可能である。

また将来、アクセスが増えて転送量が増加した場合も、同じように画像等を設置したミラーサーバーを追加で用意し、親サーバーのRewriteCondとRewriteRuleディレクティブを必要に応じて追加記述するだけで良く、簡易であるが非常に拡張性に富んだクラスターシステムであることが分かるだろう。

ページTOPへ