01/31/2009
mod_rewriteを使ってCGI環境で超高速にキャッシュを返す
キャッシュしてもいいHTMLを返すCGIであれば、以下のようにすることでレスポンスがとても高速になる
coreserverとかcoreserverとか、fastcgiが使えないので考えた苦し紛れではあるが用途によってはかなり効果がありそう
- mod_rewriteでキャッシュがあるかを判別し、あればキャッシュを返し、なければCGIに処理が渡る
- CGIはHTMLを生成し、キャッシュを出力してからHTMLを返す
- キャッシュはCronで定期的に削除される
メリットは「キャッシュがあればCGIを立ち上げる必要がない」こと
mod_rewriteはapacheでの処理なので、キャッシュのレスポンスは静的なHTMLと同じ
また要求があった際にのみCGIでHTMLが生成されるので、ページ数が大量であっても全部を最初に生成したりする必要がない
リクエストが 〜/hoge/[0-9a-z]/ の場合
/hoge.py
があるとして
Options +ExecCGI AddHandler cgi-script .py RewriteEngine On #とりあえずキャッシュのパスに書き換える RewriteRule ^hoge/([0-9a-z]*([0-9a-z])([0-9a-z]))/$ cache/hoge/$2/$3/$1 #mime-typeを設定 RewriteRule ^cache - "[T=text/html;charset=utf-8]" #キャッシュが存在していないなら RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-s #hoge.pyにパスを書き換え RewriteRule ^cache/hoge/[0-9a-z]/[0-9a-z]/([0-9a-z]+)$ hoge.py&page=$1 [L]
hoge.py
def putCache(data, key): #keyは36進数 key = '0' + key import re cpath = re.search( '^[0-9a-z]*([0-9a-z])([0-9a-z])$', key ) cp1 = cpath.group(1) cp2 = cpath.group(2) import os root, d = os.path.split( os.path.abspath(__file__) ) path = os.path.join( root, 'cache', 'hoge', cp1, cp2, key ) fo = file( path, 'wb' ) fo.write( data ) fo.close()
こんな感じで
gzipもついでにしておく場合は
def genGZ(html): import cStringIO import gzip gzbuf = cStringIO.StringIO() gz = gzip.GzipFile( mode = 'wb', fileobj = gzbuf, compresslevel = 9 ) gz.write( html ) gz.close() data = gzbuf.getvalue() return data def resGZ(data): print 'Status: 200 OK' print 'Content-Type: text/html; charset=utf-8' #rewriteのForceMIMEで上書きされる print 'Content-Encoding: gzip' print 'Content-Length: %d' % (len(data)) print '' print data
この場合、キャッシュはContent-Encodingが出力されないので化ける
Header set Content-Encoding "gzip"
を作るとOK
デメリットは
- htaccessを触るのでこのあたりを書き換えるときにミスがあるとサイト全体が500になる
- Cronで定期的にキャッシュを削除しないといけない
ぐらいかな
おまけ
/cache/〜/[0-9a-z]/[0-9a-z]/を作る
dirs = ['hoge', 'foo', 'bar'] root = os.path.dirname( os.path.abspath(__file__) ) for dir in dirs: for i in xrange(36): for j in xrange(36): path = os.path.join( root, 'cache', dir, to36(i), to36(j) ) #to36で36進数に os.makedirs(path)
トラックバック - http://d.hatena.ne.jp/ruby-U/20090131/1233372302
リンク元
- 170 http://www.google.co.jp/search?hl=ja&q=mod_rewrite+gzip&sourceid=navclient-ff&rlz=1B3GGGL_ja___JP242&ie=UTF-8&aq=1&oq=mod_
- 30 http://b.hatena.ne.jp/yass/mod_rewrite/
- 20 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=ch1&q=mod_rewrite+キャッシュ&btnG=検索&lr=lang_ja
- 16 http://www.google.co.jp/search?q=mod_rewrite+キャッシュ&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 11 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ACEW_jaJP312JP312&q=htaccess 生成されない ruby
- 9 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&rls=com.ubuntu:ja:unofficial&hs=Hz6&q=htaccess+rewrite+cgi&btnG=検索&lr=lang_ja
- 8 http://www.google.co.jp/search?hl=ja&q=mod_rewrite+キャッシュ&btnG=Google+検索&lr=&aq=f&oq=
- 8 http://www.google.co.jp/search?q=cgi+キャッシュ&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 7 http://reader.livedoor.com/reader/
- 6 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=mod_rewrite+cache