Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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
$ 

あ。ちなみに、起動順は必ずmemcachedApacheの順です。ソースを見ると、モジュール初期化後にmemcachedへの接続をしているので、先にmemcachedが起動してないとダメです。


ブラウザからHTMLファイルや画像ファイルにアクセスして、問題なく表示されることを確認。ついでに、先日エントリしたmemcacheの管理画面を使って、キャッシュされている内容を確認。

おお、ちゃんとキャッシュされてるみたい。


キャッシュの有効期限とかどうなってるのかなぁ、と思って色々やってたんですが、mod_cacheの CacheDefaultExpireとかCacheMaxExpireには無反応っぽかったです。また、ソースをざっと見た限り、memcachedには有効期限「0」(多分、無期限)で登録してるようなので、ディレクティブを追加してmemcached側の有効期限を設定させるようにした方が良いのかなぁ、と思ったり。


とりあえず、ここまで。