HerokuのCedarスタックでキャッシュ
CedarスタックだとVarnishが動かないのでmemcachedにキャッシュするメモ。
Gemfile
rack-cacheとmemcachedクライアントのdalliを追加。
gem 'rack-cache', require: 'rack/cache'gem 'dalli'
config.ru
rack-cacheを使う設定を追加。サーバのアドレスはMEMCACHE_SERVERSという環境変数で渡されるので、それを使います。ローカルで開発するときはMEMCACHE_SERVERSは存在しないので、かわりにファイルにキャッシュします。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 * 60end
設定
memcacheのaddonを追加します。
heroku addons:add memcache
動作確認
レスポンスのX-Rack-Cacheヘッダで動作を確認できます。miss, storeと表示されればキャッシュされており、freshであればキャッシュを返していることが分かります。