3

こんにちは、

HTTP キャッシングを Rack::Cache およびアクション キャッシング (Heroku でホストされているアプリ) と組み合わせようとして、いくつかの問題に遭遇しました。

それらを個別に使用すると、機能しているようです。アクション キャッシュを有効にすると、ページの読み込みが速くなり、ログはキャッシュ中であることを示します。コントローラー (eTag、last_modified、および fresh_when) での HTTP キャッシュにより、適切なヘッダーが設定されているように見えます。

ただし、2 つを結合しようとすると、アクション キャッシングのように見えますが、HTTP ヘッダーは常に max_age: 0, must_revalidate です。どうしてこれなの?私は何か間違ったことをしていますか?

たとえば、「ホーム」アクションのコードは次のとおりです。

class StaticPagesController < ApplicationController
  layout 'public'

  caches_action :about, :contact, ......, :home, .....

  ......

  def home
    last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml")
    fresh_when last_modified: last_modified , public: true, etag: last_modified
    expires_in 10.seconds, :public => true       
  end

すべての意図と目的のために、これには max-age 10 no? の public cache-control タグが必要です。

$ curl -I http://myapp-staging.herokuapp.com/

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: text/html; charset=utf-8
Date: Thu, 24 May 2012 06:50:45 GMT
Etag: "997dacac05aa4c73f5a6861c9f5a9db0"
Status: 200 OK
Vary: Accept-Encoding
X-Rack-Cache: stale, invalid
X-Request-Id: 078d86423f234da1ac41b418825618c2
X-Runtime: 0.005902
X-Ua-Compatible: IE=Edge,chrome=1
Connection: keep-alive

構成情報:

# Use a different cache store in production
config.cache_store = :dalli_store

config.action_dispatch.rack_cache = {
  :verbose      => true,
  :metastore => "memcached://#{ENV['MEMCACHE_SERVERS']}",
  :entitystore => "memcached://#{ENV['MEMCACHE_SERVERS']}"#,
}

私の考えでは、アクション キャッシングとリバース プロキシを正しく使用できるはずですか? それらがかなり似たようなことをすることは知っていますが (ページが変更されると、プロキシとアクション キャッシュの両方が無効になり、再生成する必要があります)、そこに両方を含めることができるはずだと思います。または、1つを取り除く必要がありますか?

アップデート

以下、回答ありがとうございます!うまくいくようです。しかし、すべてのコントローラー アクションに対して set_XXX_cache_header メソッドを記述する必要がないようにするために、これが機能しない理由が何かわかりますか?

before_filter :set_http_cache_headers

.....

def set_http_cache_headers
  expires_in 10.seconds, :public => true
  last_modified = File.mtime("#{Rails.root}/app/views/static_pages/#{params[:action]}.html.haml")
  fresh_when last_modified: last_modified , public: true, etag: last_modified
end
4

1 に答える 1

5

アクション キャッシュを使用すると、応答本文とコンテンツ タイプのみがキャッシュされます。応答に対するその他の変更は、後続の要求では発生しません。

ただし、アクション自体がキャッシュされている場合でも、アクション キャッシュはフィルターの前に実行されます。

したがって、次のようなことができます。

class StaticPagesController < ApplicationController
  layout 'public'

  before_filter :set_home_cache_headers, :only => [:home]

  caches_action :about, :contact, ......, :home, .....

  ......

  def set_home_cache_headers
    last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml")
    fresh_when last_modified: last_modified , public: true, etag: last_modified
    expires_in 10.seconds, public: true       
  end
于 2012-07-03T19:08:32.550 に答える