Squidとの連携

アクセス量が多いことが予想された為、Squidをフロントに置く構成に。

実際の構成は

  Squid(cache) => lighttpd(revproxy/vhost) => thin(dynamic contents)

という感じ。

ここで、thinが配信する動的コンテンツが全てsquidでキャッシュに載らない問題が発生。

原因はさくさんが言っているようにLast-Modifiedヘッダの不足でした。
なので、Sinatra側で適当にこれを配信するようにしてやる:

module Sinatra
  class Response
    unless instance_methods.include?('finish_old')
      alias finish_old finish

      def finish(&block)
        $crawltime ||= DateTime.now
        header['Last-Modified'] ||= Time.parse($crawltime.to_s).httpdate

        finish_old(&block)
      end
    end
  end
end

てきとーすぎるので適宜調整してやってください。crawltimeは一応バックエンドDBの最終アップデート時刻。

実際公開x日目にしてアクセス量はそれなりに多いので、正解だった感じ。公開直後は10req/secぐらいまで行きましたがちゃんと裁いてくれました。
サーバー提供してくれたさくさんありがとう。