トップ «前の日記(2006年06月02日) 最新 次の日記(2006年06月04日)» 編集

のろのろのろ雑記


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]

 これで静的出力はばっちりです。