2012-05-24 3 views
8

나는 내 인생에 대해 이것을 이해할 수 없다. Roku :: Cache를 사용하여 Heroku의 내 정적 공개 페이지 일부를 캐싱하고 리버스 프록시를 지나칠 경우를 대비해 캐싱 작업을 수행합니다.Heroku 삼나무 스택 - 랙 캐시 헤더

예를 들어, 다음 코드는 내 "집"행동의 모든 의도와 목적을 위해

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 

, 이것은 최대-10 세와 공공 캐시 제어 태그를해야 더?

$ 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']}"#, 
} 

# OLD : Disable Rails's static asset server (Apache or nginx will already do this) 
config.serve_static_assets = true 
config.static_cache_control = "public, max-age=2592000" 

는 (?하지만 더 쉬운 방법이 있어야한다처럼 어쩌면 수동으로 Cache-Control 헤더를 설정하는 방법이 보인다). 심지어 최소한 아래로 컨트롤러 행동을 시도

UPDATE :

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

그리고 그것은 작동하지 않습니다 ...

HTTP/1.1 200 OK 
Server: nginx 
Date: Thu, 24 May 2012 19:15:18 GMT 
Content-Type: text/html; charset=utf-8 
Connection: keep-alive 
Status: 200 OK 
X-Ua-Compatible: IE=Edge,chrome=1 
Etag: "733798214c652f39ae79b4037e9111dc" 
Cache-Control: max-age=0, private, must-revalidate 
X-Request-Id: b33087fe0c2ae986c4cac88f14420b7c 
X-Runtime: 0.006000 
X-Rack-Cache: stale, invalid 
Vary: Accept-Encoding 
X-Varnish: 349105873 
Age: 0 
Via: 1.1 varnish 

!

+0

액션 캐싱을 사용할 수도 있습니까? 헤더가 어떻게 다른지 확인하기 위해 페이지 캐싱으로 테스트 해 보셨습니까? – KendallB

+0

hmmm 귀하의 요지를 봅니다. Rack :: Cache가 페이지를 제공하도록 올바르게 설정되어 있다면 (가장 깨끗한 방법은 아니지만 Heroku에서 할 수있는 최선의 방법입니다.), 캐시 작업을 위해 아무것도 넣지 않아야합니다. 나는 그곳에 좋은 측정을 위해 그것을 가지고 있다고 생각합니다. 나는 그것을 꺼내보고 무슨 일이 일어나는지를 볼 것입니다. 다시 너에게 갈거야. – Brandon

+0

그래서 당신 말이 맞습니다. 캐싱 작업을 수행 할 때 헤더가 올바르게 설정되었습니다. 나는 이것이 비록 필연적으로 이것을 이해하고 있는지 모른다. HTTP 응답 헤더를 작업 결과를 캐싱과 분리하여 설정하면 안됩니까? 즉, 내 레일 앱 (액션 캐시)의 응답을 캐싱 할 수는 없지만 사용자가 페이지를 다시 요청하면 서버에 전혀 맞지 않는 HTTP 헤더를 설정해야합니다 (올바른 설정으로 제공됨). 최대 연령 헤더에?) – Brandon

답변

1

아마도 모든 것을 재고하고 캐싱 레일을 사용하기 만하면됩니다. 새로운 cache_digests 보석은 레일 수준에서 당신이 원하는 것을 할 사소한해야한다 : https://github.com/rails/cache_digests

내가이 파일의 타임 스탬프를 10 초마다 확인하는 파일 시스템 호출을하고 포함하여 방법을 이길 거라 확신.