Apache+mod_mem_cacheでキャッシュしてみる

Squidを使えば簡単にリバースプロキシを作ることができます。ただ、一つ問題がありキャッシュ時間が分単位となります。

リアルタイム性をできるだけ持たしたいのだが、数秒間のキャッシュを行いたいときにはSquidではちょっとできそうにありません。そこでApache+mod_mem_cacheで試してみます

参考にしたページ

  1. http://httpd.apache.org/docs/2.2/mod/mod_cache.html
  2. http://d.hatena.ne.jp/mhag/20070417/1176786290
  3. http://blog.as-is.net/2007/02/mt-searchcgi-modcache.html
  4. http://kamoland.com/wiki/wiki.cgi?mod_cache%A4%C7Wiki%28CGI%29%A4%CE%B9%E2%C2%AE%B2%BD
  5. http://d.hatena.ne.jp/rougeref/20090616

Apache2.2.22インストール

./configure --enable-so --enable-ssl --with-ssl=/usr/local/ssl/lib --enable-logio --enable-proxy \
--enable-rewrite --enable-cache --enable-mem-cache --enable-disk-cache
make
make install

httpd.confをこんな感じで設定します設定します。

どうやらmod_mem_cacheはメモリ上のキャッシュが変に効いているので最初はいいがそのうちダメになるので、mod_disk_cacheをつかいます

 
	 ProxyPass ajp://localhost:8009/jsp/
 
LoadModule perl_module modules/mod_perl.so


		 SetHandler perl-script
		 PerlResponseHandler ModPerl::Registry
		 PerlOptions +ParseHeaders
		 Options +ExecCGI
		 Order allow,deny
		 Allow from all


  
	 
		 CacheRoot /tmp
		 CacheEnable disk /
		 CacheEnable disk /jsp
		 CacheEnable disk /cgi
		 CacheDefaultExpire 5
		 CacheMaxExpire 5
		 CacheIgnoreCacheControl On
		 CacheIgnoreNoLastMod On
		 CacheIgnoreHeaders Set-Cookie
		 CacheDirLevels 5
		 CacheDirLength 3
		 CacheIgnoreURLSessionIdentifiers PHPSESSIONID jsessionid
	 
 

今回はJSPとperlのCGIを対象にしますので、mod_perlも設定しておきます

Perl

これらの設定でJSPは簡単にキャッシュが効いてくれたのですがどうもcgiはうまくキャッシュされていない模様です。

どうもHTTPHeaderにExpiresとCache-Control:max-ageがうまく入っていなかったようですのでcgi側で強制的に入れてやります

#!/usr/bin/perl
print "Content-type:text/plain\n";
print "Expires: 5\n";
print "Cache-Control: max-age=5\n";
print "last-Modified:	Tue, 15 Nov 1994 12:45:26 GMT\n";
print "\n";

結局のところ

apacheの設定

mod_disk_cacheを使うのが吉。

その場合、CacheDirをクローンで定期的に消す必要あり

cgiの設定

たぶん不要だがmod_perlを使うようにする

perlの書き方

HeaderにExpires:5 と Cache-Control: max-age=5 を入れておく

なぜか勝手にApacheがmax-age=0を返していたのでこれは必須