UNIX的なアレ:gihyo.jp出張所
第17回 知っておきたいApacheの基礎知識 その13
前回はmod_cacheの基本的な利用方法について説明をしてきました。しかしながら,本格的にキャッシュを導入していくとなると専用のサーバを構築するようになることでしょう。キャッシュ専用のサーバというとCDNの業者が提供するものを思いうかべてしまうかもしれません。しかし,Apacheをうまく使うことで自分自身で構築することも可能です。
今回は,mod_cacheとmod_proxyを利用してcacheサーバを構築する方法を紹介していきたいと思います。
リバースProxyを使ったキャッシュサーバ
キャッシュ専用のサーバとはどういったものなのでしょうか。仕組みとしては,何らかのコンテンツをキャッシュしておき,ユーザにそのキャッシュしたコンテンツを返すだけのシンプルな機構です(図1)。
こちらの図は,キャッシュをする仕組みを簡単に表した図です。一般的に,キャッシュの元となるコンテンツを配信するサーバを「Origin サーバ」と表現します。実際はHTML動的に生成させたり,サムネイル画像を生成したりとう動作が多いと思いますので,そのようなサーバをイメージしてください。
Originサーバは動的な処理をするため比較的負荷がかかりやすいサーバです。負荷を減らす最も効果的な,方法はOriginサーバへアクセスを減らすことです。それを実現するために,Originサーバが動的に生成したコンテンツを,キャッシュサーバで一時的に保管し,静的なコンテンツとして返すといった方法をとります。そのため,結果としてOriginサーバへのアクセスがへり,負荷を軽減することができるようになります。
なお,キャッシュサーバはOriginサーバに比べ,よりシンプルで高速な動作を期待されています。そのため,できるだけ余計なことはさせずにキャッシュを返すことに専念させるのが無難でしょう。
mod_proxyをインストールする
さて,それではmod_proxyを追加でインストールしましょう。
mod_proxyは標準では組み込まれませんので,追加でコンパイルをする必要があります。なお,${APACHE_SRC_DIR}はapacheをコンパイルするときに利用したソースのディレクトリを指しています。
$ sudo /usr/local/apache2/bin/apxs -a -i -c \
${APACHE_SRC_DIR}/modules/proxy/mod_proxy.c \
${APACHE_SRC_DIR}/modules/proxy/proxy_util.c
$ sudo /usr/local/apache2/bin/apxs -a -i -c \
${APACHE_SRC_DIR}/modules/proxy/proxy_http.c
さて,コンパイルが完了したら,モジュールができているかどうかを確認してみましょう。
$ ls -l /usr/local/apache2/modules/*proxy*
-rwxr-xr-x 1 root root 98313 2009-04-30 11:08 /usr/local/apache2/modules/mod_proxy.so
-rwxr-xr-x 1 root root 67865 2009-04-30 11:10 /usr/local/apache2/modules/proxy_http.so
上記の2つのファイルができていれば無事完了です。
それでは,実際に動作をさせてみましょう。
mod_proxyをサーバに組み込む
それでは実際にmod_proxyをサーバに組み込んでいきましょう。以下のようにhttpd.confを記述してください。なお,今回は1つのApacheの内部でmod_proxyを動作させますので,port virtualで2つのPortをListenするように設定します。
#
# Cache Server Settings
#
LoadModule cache_module modules/mod_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/proxy_http.so
<VirtualHost *:80>
LogLevel debug
ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/cache_error_log
CustomLog /usr/local/apache2/vhosts/www.example.com/logs/cache_access_log common
## Cache Settings
CacheRoot /usr/local/apache2/cache
CacheIgnoreCacheControl On
CacheEnable disk /
CacheMinFileSize 0
CacheMaxFileSize 64000
CacheDirLevels 5
CacheDirLength 3
## Proxy Settings
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/
</VirtualHost>
#
# Origin Server Settings
#
Listen 81
<VirtualHost *:81>
DocumentRoot /usr/local/apache2/vhosts/www.example.com/htdocs
ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/origin_error_log
CustomLog /usr/local/apache2/vhosts/www.example.com/logs/origin_access_log common
</VirtualHost>
設定ファイルを記述したら,Apacheを再起動させて設定内容を反映させましょう。
httpd.confの流れ
さて,若干長い設定ファイルですが少しずつ見ていきます。こちらの設定ファイルは,Port80番がキャッシュサーバ,Port81番がOriginサーバという構成で組んでいます。
まず,ユーザからのリクエストはPort80番のキャッシュサーバに流れます。
そこで,まずはキャッシュにヒットするかどうかという判定が行われます。その後,キャッシュにヒットしないと判断されたリクエストのみがProxyの設定に流れるようになっています。
Proxyの設定に流れたあとは,Port81番で待ち受けているVirtualHostにリクエストを流します。その後,ドキュメントルートからリクエストを返しています。
最初にも書いたように,今回のテーマは「キャッシュ専用サーバ」です。
そのため,実際に設定する場合は,Proxyさせる先のサーバは別サーバになることでしょう。そのときは,ProxyPassとProxyPassReverseの設定を別のサーバに向けるだけで簡単に設定をすることができます。
[TIPS] キャッシュされているかどうかを調べる方法
キャッシュがどのように動いているかを調べるのはなかなか難しいところです。そのようなときは,loglevelを上げてerror_logを見てみましょう。実際に設定例でもloglevelはdebugで設定してあります。debugのlogはerror_logに出力されていますので,確認してみてください。
[Thu Apr 30 11:33:01 2009] [debug] modules/experimental/mod_disk_cache.c(642): disk_cache: Stored headers for URL www.example.com/index.html?
[Thu Apr 30 11:33:01 2009] [debug] modules/experimental/mod_disk_cache.c(744): disk_cache: Body for URL www.example.com/index.html? cached.
正常にキャッシュされたときのlogは上記のようになっています。
最後に
さて,2回にわたるcacheの説明でしたが意外と簡単に構築できるものということはわかっていただけたでしょうか? ある程度のアクセス数になってくると避けては通れないシステムですので,考え方だけでも是非マスターしてください。
また,キャッシュサーバを構築する場合は,Apacheの他に,より高機能なSquidなどもあります。興味を持たれた方は是非チャレンジしてみてください。

