2

最近、Rails アプリケーションに Dalli gem を使用して、memcached heroku アドオンでキャッシュを実装しました。しかし、Heroku にデプロイすると、画像を含むすべての静的アセットもキャッシュされるため、memcached のサイズがすぐに膨れ上がります。heroku ログのサンプルは次のようになります

cache: [GET /assets/application.css] fresh
app[web.1]: cache: [GET /assets/sign-in-twitter.gif] fresh
app[web.1]: cache: [GET /assets/ajax-loader.gif] fresh
app[web.1]: cache: [GET /assets/sign-in-facebook.gif] fresh

特にインデックス ページの場合、キャッシュ サイズはリクエストごとに約 5MB ずつ増加します。この動作は構成可能ですか? すべてのページのすべての画像をプロアクティブにキャッシュするのではなく、フラグメント キャッシュのみをキャッシュするように memcached を構成できますか?

4

1 に答える 1

5

dalli gem を使用して、次のようにしconfig/environments/production.rbます。

config.action_dispatch.rack_cache = {
  :metastore => Dalli::Client.new,
  :entitystore => 'file:tmp/cache/rack/body',
  :allow_reload => false
}

上記の構成では、メタストア情報は memcached にキャッシュされますが、アセットの実際の本体はファイル システムにキャッシュされます。

config/application.rb

if !Rails.env.development? && !Rails.env.test?
  config.middleware.insert_before Rack::Cache、Rack::Static、URL: [config.assets.prefix]、ルート: 'public'
終わり

Rack::Static
  の使用法: Rack::Staticミドルウェアは、一致するプレフィックスを持つ URL をルート ディレクトリに提供します。ここでは、config.assets.prefixを URL プレフィックスとして指定しています。デフォルトは'/assets'です。これにより、 Rails::Cacheをヒットする代わりにpublic/assetsディレクトリから直接アセットを提供する必要があります。これは、本番環境で「rake assets:precompile」を実行した場合にのみ機能します。そうしないと、 「public/assets」にプリコンパイルされたアセットがありません。

于 2014-04-23T05:55:39.047 に答える