mod_cache+memcached=mod_memcached_cache
先日PHPで作られたmemcacheを使ったキャッシュプロキシをさっくり試していたんですが、
mod_proxyとmod_cacheを併せたようなヤツだったか。分からんでもないが、素直にmod_proxy+mod_cacheでええじゃんじゃね?
と思えてきました。PHPでやってパフォーマンス的にも微妙だったので。。。
で、「そういや、mod_cacheのストレージでmemcached使うのはないのかな?」とふと思ったのでググってみたところ、そのままの名前の物がありました。
This module allows your Apache 2.2.x installation to serve cached data quickly from one or more memcached server instances rather than from your file system.
バージョン0.1.0で、2007/09/12を最後に更新が止まったままと言うのが気になりますが、早速インストールしてみましたww
環境は
- CentOS4.6 on VMwarePlayer
- Apache 2.2.6
- Repcached 2.0.0
です。
まずは、必要となるapr_memcacheのインストール。これ自体、すごく便利そう:-)
$ wget http://www.outoforder.cc/downloads/apr_memcache/apr_memcache-0.7.0.tar.bz2 $ tar jxf apr_memcache-0.7.0.tar.bz2 -C /usr/local/src/ $ cd /usr/local/src/apr_memcache-0.7.0/ $ ./configure $ make $ sudo make install $ sudo ln -s /usr/local/apache2/include/apr_memcache-0/apr_memcache.h /usr/local/apache2/include/ $
続いて、mod_memcached_cacheのインストール。インストール先は[Apacheのインストールディレクトリ]/lib/になりました。
$ wget http://modmemcachecache.googlecode.com/files/mod_memcached_cache-0.1.0.tar.bz2 $ tar jxf mod_memcached_cache-0.1.0.tar.bz2 -C /usr/local/src/ $ cd /usr/local/src/mod_memcached_cache-0.1.0/ $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apache2/lib/ CFLAGS=-I/usr/local/src/httpd-2.2.6/modules/cache ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-apr-memcache=/usr/local/apache2/ $ make $ sudo make install $ LANG=C ll -tr /usr/local/apache2/lib/libapr_memcache.* -rwxr-xr-x 1 root root 39601 Jun 11 18:48 /usr/local/apache2/lib/libapr_memcache.so.0.0.1 lrwxrwxrwx 1 root root 24 Jun 11 18:48 /usr/local/apache2/lib/libapr_memcache.so.0 -> libapr_memcache.so.0.0.1 lrwxrwxrwx 1 root root 24 Jun 11 18:48 /usr/local/apache2/lib/libapr_memcache.so -> libapr_memcache.so.0.0.1 -rwxr-xr-x 1 root root 1032 Jun 11 18:48 /usr/local/apache2/lib/libapr_memcache.la -rw-r--r-- 1 root root 40464 Jun 11 18:48 /usr/local/apache2/lib/libapr_memcache.a $
設定ファイルはGoogle Code Archive - Long-term storage for Google Code Project Hosting.をベースにMemcachedCacheServerの値だけ変更。
LoadModule cache_module modules/mod_cache.so LoadModule memcached_cache_module modules/mod_memcached_cache.so <IfModule mod_memcached_cache.c> CacheEnable memcached / MemcachedCacheServer localhost:11211 MemcachedMaxServers 10 MemcachedMinConnections 10 MemcachedSMaxConnections 10 MemcachedMaxConnections 10 MemcachedConnectionTTL 60 MemcachedCacheMinFileSize 1 MemcachedCacheMaxFileSize 1048576 </IfModule>
で、Apacheの設定確認。
$ sudo /usr/local/apache2/bin/apachectl configtest httpd: Syntax error on line 497 of /usr/local/apache2/conf/httpd.conf: Syntax error on line 3 of /usr/local/apache2/conf/extra/mod_memcached_cache.conf: Cannot load /usr/local/apache2/modules/mod_memcached_cache.so into server: /usr/local/apache2/modules/mod_memcached_cache.so: undefined symbol: apr_memcache_add_server $
ぬおー。。。シンボルを見てみると
$ nm /usr/local/apache2/lib/libapr_memcache.so | grep apr_memcache_add_server 00001168 T apr_memcache_add_server $
ということで、LoadFileを先ほどの設定ファイルの先頭に追加。
LoadFile lib/libapr_memcache.so LoadModule cache_module modules/mod_cache.so LoadModule memcached_cache_module modules/mod_memcached_cache.so :
再度Apacheの設定確認。うまくいったようなので、そのまま起動。
$ sudo /usr/local/apache2/bin/apachectl configtest $ sudo /usr/local/apache2/bin/apachectl start $
あ。ちなみに、起動順は必ずmemcached→Apacheの順です。ソースを見ると、モジュール初期化後にmemcachedへの接続をしているので、先にmemcachedが起動してないとダメです。
ブラウザからHTMLファイルや画像ファイルにアクセスして、問題なく表示されることを確認。ついでに、先日エントリしたmemcacheの管理画面を使って、キャッシュされている内容を確認。
おお、ちゃんとキャッシュされてるみたい。
キャッシュの有効期限とかどうなってるのかなぁ、と思って色々やってたんですが、mod_cacheの CacheDefaultExpireとかCacheMaxExpireには無反応っぽかったです。また、ソースをざっと見た限り、memcachedには有効期限「0」(多分、無期限)で登録してるようなので、ディレクティブを追加してmemcached側の有効期限を設定させるようにした方が良いのかなぁ、と思ったり。
とりあえず、ここまで。