Squidを使えば簡単にリバースプロキシを作ることができます。ただ、一つ問題がありキャッシュ時間が分単位となります。
リアルタイム性をできるだけ持たしたいのだが、数秒間のキャッシュを行いたいときにはSquidではちょっとできそうにありません。そこでApache+mod_mem_cacheで試してみます
参考にしたページ
- http://httpd.apache.org/docs/2.2/mod/mod_cache.html
- http://d.hatena.ne.jp/mhag/20070417/1176786290
- http://blog.as-is.net/2007/02/mt-searchcgi-modcache.html
- http://kamoland.com/wiki/wiki.cgi?mod_cache%A4%C7Wiki%28CGI%29%A4%CE%B9%E2%C2%AE%B2%BD
- 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.soSetHandler 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を返していたのでこれは必須