2012-05-24 48 views
8

Tôi không thể hình dung điều này cho cuộc sống của tôi. Đang cố gắng sử dụng Rack :: Cache để cache một số trang công cộng tĩnh của tôi trên Heroku, ngoài việc thực hiện bộ nhớ đệm hành động trong trường hợp nó vượt qua proxy ngược lại.Heroku Cedar Stack - Tiêu đề bộ nhớ cache giá

Ví dụ, đây là mã trong "nhà" của tôi hành động:

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 

Đối với tất cả các tính năng, điều này nên có một thẻ nhớ cache kiểm soát công cộng với 10 max-age không?

$ 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 

Tôi đang làm điều gì đó khủng khiếp sai? Tôi cảm thấy như có cái gì đó với câu trả lời bộ nhớ cache cũ, không hợp lệ ... đó là lần thứ 4 tôi đã truy cập trang.

Config Thông tin:

# 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" 

(? Có thể có một cách để tự đặt tiêu đề bộ nhớ cache kiểm soát Có vẻ như không nên có một cách dễ dàng hơn mặc dù).

CẬP NHẬT

Tôi thậm chí đã cố gắng thực hiện hành động điều khiển xuống đến mức tối thiểu:

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 

Và nó không hoạt động ...

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

Điều này thậm chí có thể thực hiện với bộ nhớ đệm hành động không? Bạn đã thử nghiệm nó với bộ nhớ đệm trang chỉ để xem các tiêu đề khác nhau như thế nào? – KendallB

+0

hmmm Tôi thấy quan điểm của bạn. Nếu Rack :: Cache được thiết lập đúng để phục vụ các trang (không phải là phương pháp sạch nhất, nhưng tốt nhất bạn có thể làm trên Heroku), tôi thực sự không nên có bất cứ điều gì trong đó cho các hành động caching. Tôi cho rằng tôi chỉ có điều đó ở đó để có biện pháp tốt. Tôi sẽ thử lấy nó ra và xem chuyện gì xảy ra. Tôi sẽ gửi lại cho bạn. – Brandon

+0

Vì vậy, có vẻ như bạn đã đúng. Khi tôi thực hiện thao tác lưu vào bộ nhớ cache, tiêu đề đã được đặt chính xác. Tôi không biết rằng tôi nhất thiết phải hiểu điều này mặc dù. Không nên đặt tiêu đề phản hồi HTTP tách biệt với bộ nhớ đệm kết quả của một hành động? Tức là, tôi không thể lưu trữ phản hồi của ứng dụng đường ray (bộ nhớ cache hành động) nhưng vẫn đặt tiêu đề HTTP sao cho nếu người dùng yêu cầu lại trang, họ không truy cập vào máy chủ (cung cấp cài đặt chính xác trên tiêu đề tối đa?) – Brandon

Trả lời

1

Có thể suy nghĩ lại toàn bộ điều và chỉ sử dụng bộ nhớ đệm đường ray. Đá quý cache_digests mới sẽ làm cho nó tầm thường để làm những gì bạn muốn ở cấp độ đường ray: https://github.com/rails/cache_digests

Tôi sẵn sàng đặt cược này sẽ đánh bại phương thức của bạn bao gồm thực hiện cuộc gọi hệ thống tập tin để kiểm tra dấu thời gian của tệp sau mỗi 10 giây.

Các vấn đề liên quan