先日、リバースプロキシしてメモリキャッシュしないといけないことがあったのですが、どうもキャッシュがうまく働いてくれず四苦八苦しておりました。
google先生も設定方法は教えてくれるのですが、動かなかった場合の具体的な対処方はなかなか見つからず、ログと戦う羽目になってしまいました。
そんなわけで今回は、Apacheのリバースプロキシ(mod_proxy_balancer)とメモリキャッシュ(mod_mem_cache)のお話。
リバースプロキシの設定
まずはmod_proxy_balancerの設定。Webサーバ側は特に何もせず、プロキシサーバ側でBalancerMemberにWebサーバを指定します。
ProxyRequests Offこれは色々なサイトにもあるものなので、細かい説明は割愛させていただきます。
ProxyPass / balancer://cluster/
<Proxy balancer://cluster/>
BalancerMember http://**** loadfactor=10
BalancerMember http://**** loadfactor=10
BalancerMember http://**** loadfactor=10
</Proxy>
Apacheプロセスの設定
メモリキャッシュをつかうのでApacheプロセスをworkerで起動するように設定変更をします。/etc/sysconfig/httpdを開き、下記1行がコメントアウトされていたので解除。
HTTPD=/usr/sbin/httpd.worker
メモリキャッシュの設定
mod_cacheおよびmod_mem_cacheの設定です。一般的な設定では、こんな感じでしょうか。画像の多いサーバなので、キャッシュサイズは多めに設定してあります。
<IfModule mod_cache.c>
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheStoreNoStore On
CacheStorePrivate On
CacheEnable mem /
</IfModule>
<IfModule mod_mem_cache.c>
MCacheSize 1310720
MCacheMaxObjectCount 100000
MCacheMinObjectSize 1
MCacheMaxObjectSize 1310720
MCacheMaxStreamingBuffer 1310720
</IfModule>
動作チェック
以上を設定してapacheの再起動をしてみましたが、うまく動いてない模様でした。サーバがさくらインターネットのサーバだったので管理画面から転送量グラフを眺めてみましたが、送信と受信で転送量に差が見受けられませんでした。
(今回はたまたまグラフで確認できましたが、ツール等が入っていない場合は/proc/net/devあたりを監視することになると思います。)
そこで、httpd.confのLogLevelをwarnからdebugに。そうするとエラーログに以下のようなメッセージが出ていました。
[debug] cache_storage.c(257): cache_select_url(): Vary header mismatch.ヘッダがおかしいからキャッシュできませんよ、ということみたいです。
そこで、httpd.confの<IfModule mod_cache.c>~</IfModule>の間に次の1行を追加。
CacheIgnoreHeaders Set-Cookie User-Agent Varyapacheを再起動したところ、無事にキャッシュが機能していました。
mod_cacheの設定についてはまだまだ改良の余地があるかと思いますが、apacheサーバ1台で簡単にキャッシュもとれるというのは、やはり魅力的だと思います。


