April 13, 2012
CedarスタックだとVarnishが動かないのでmemcachedにキャッシュするメモ。
rack-cacheとmemcachedクライアントのdalliを追加。
gem 'rack-cache', require: 'rack/cache'
gem 'dalli'
rack-cacheを使う設定を追加。サーバのアドレスはMEMCACHESERVERSという環境変数で渡されるので、それを使います。ローカルで開発するときはMEMCACHESERVERSは存在しないので、かわりにファイルにキャッシュします。default_ttlは個別に指定しなかったときのキャッシュ時間です。
use Rack::Cache,
verbose: true,
default_ttl: 30 * 60,
metastore: ENV['MEMCACHE_SERVERS'] ? "memcached://#{ENV['MEMCACHE_SERVERS']}/meta" : 'file:tmp/cache/rack/meta',
entitystore: ENV['MEMCACHE_SERVERS'] ? "memcached://#{ENV['MEMCACHE_SERVERS']}/body" : 'file:tmp/cache/rack/entity'
アプリ側でCache-Controlヘッダを付けるとそれを参照してキャッシュしてくれます。以下はSinatraでの例です。
get '/' do
cache_control :public, :max_age => 6 * 60 * 60
end
memcacheのaddonを追加します。
$ heroku addons:add memcache
レスポンスのX-Rack-Cacheヘッダで動作を確認できます。miss, storeと表示されればキャッシュされており、freshであればキャッシュを返していることが分かります。