2006年06月03日 Apacheに乗り換え/tDiaryの静的出力
_ [Web]Apacheに乗り換え
tDiaryを静的生成する方法はないものかと探していると、tmaeda 日記 - 負荷対策:静的 HTML 化を発見。「そうか! mod_rewriteか!」と思ったものの、サーバはAN HTTPD…
この雑記のアクセスが増えることは恐らくないと思いますが、この際にと面白半分でApacheに乗り換えちゃいました。
最新エントリも含めて静的出力するようにして、自己満足です。パフォーマンスも向上しました。
_ [Web]tDiaryを最新エントリまで静的出力する方法
引数なしでindex.rbが呼ばれる状態、いわゆる「トップページ(最新エントリ)」も静的出力する方法です。あまり良い方法とは言えませんが… mod_rewriteと.htaccessを使えることが大前提です。
最初の追加内容
tmaeda 日記 - 負荷対策:静的 HTML 化を参考に、「mod_rewriteの設定」以外をやってしまいます。もちろん、キャッシュの出力先などは必要に応じて変更します(相対パス可)。
index.rbの変更
コメント投稿時にキャッシュを削除する
最初のほうにある、コメント投稿時の処理
if @cgi.valid?( 'comment' ) then
の直後に、次の4行を追加します。
cache = "トップページのファイル名 [例]./index.html" if FileTest.exist?(cache) then File.delete(cache) end
キャッシュを出力する
「負荷対策:静的 HTML 化 - comment が投稿されたら、キャッシュを削除」で追加した、
if @cgi.valid?( 'date' ) then (中略) f.write "#{Time.now} static cache written(#{@cgi['date']}.html).\n" } } end end
の最後の「end」を削除し、次の内容を追加します。
elsif @cgi.valid?( 'category' ) then else File.open("トップページのファイル名 [例]./index.html", "w") {|f| f.write body } end
update.rbの変更
記事投稿時にキャッシュを削除する
「負荷対策:静的 HTML 化 - 記事を更新したらキャッシュを削除」で追加した、
def delete_cache(cgi) date_string = sprintf("%04d%02d%02d", cgi['year'], cgi['month'], cgi['day']) (中略) end end
の「def delete_cache(cgi)」の後に、次の内容を追加します。
cache = "トップページのファイル名 [例]./index.html" if FileTest.exist?(cache) then File.delete(cache) end
.htaccessの設定
mod_rewriteを利用して、キャッシュのあるものはキャッシュへ、そうでないものはindex.rbへ飛ばします。
RewriteEngine on # キャッシュのあるページへは、そのキャッシュを読ませる RewriteCond %{REQUEST_URI} ^\/diary\/([0-9]+\.html$) RewriteCond /WWW/diary/cache/%1 -f RewriteRule .* cache/%1 [L] # キャッシュのないページへは、index.rbで表示させる RewriteRule ^([0-9]+)\.html$ index.rb?date=$1 [L] # コメントの投稿であれば、index.rbに飛ばす RewriteCond %{REQUEST_URI} ^\/diary\/$ RewriteCond %{REQUEST_METHOD} ^POST$ RewriteRule .* index.rb [L] # カテゴリの選択であれば、index.rbに飛ばす RewriteCond %{REQUEST_URI} ^\/diary\/$ RewriteCond %{REQUEST_METHOD} ^GET$ RewriteCond %{QUERY_STRING} ^.+$ RewriteRule .* index.rb [L] # トップのキャッシュがなければ、やはりindex.rbへ RewriteCond %{REQUEST_URI} ^\/diary\/$ RewriteCond %{QUERY_STRING} ^$ RewriteCond /WWW/diary/index.html !-f RewriteRule .* index.rb [L]
これで静的出力はばっちりです。