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ぐらいまで行きましたがちゃんと裁いてくれました。
サーバー提供してくれたさくさんありがとう。