簡體   English   中英

在Rails / Cloudfront / Heroku中設置資產緩存過期

[英]Setting Asset Cache Expiration in Rails / Cloudfront / Heroku

我從Google pagespeed工具收到錯誤,說明沒有為我的資產指定緩存過期。

我通過cloudfront服務斷言,我的站點(Ruby on Rails)托管在Heroku上

https://www.driverhunt.com/…9a42dc64767309bbb76af8a1eaef10b3c0cb.css (expiration not specified)
https://www.driverhunt.com/…74901ff9e954e9fca26f71542e8fc8d807684.js (expiration not specified)
https://www.driverhunt.com/…ad7b9e065ed95559bdf1c426bc94834f09e0.jpg (expiration not specified)

首先,它似乎不是由雲端服務的東西。 第二:

這是一個雲端問題,一個heroku問題,還是一個rails問題? 它可以以編程方式解決,還是我需要擺弄heroku / cloudfront設置?

設置響應標頭

要啟用瀏覽器緩存,您必須設置Cache-Control和Expires響應標頭。

調試提示

要查看現有的緩存設置,請使用瀏覽器的調試器。 對於Chrome,在應用的任何頁面上,打開調試器並查看:

在此輸入圖像描述

了解代碼更改會產生什么影響非常重要。 在您的應用程序上按原樣運行此操作並獲取基線響應標頭。


設置響應標頭

當您可以訪問服務器配置文件時,在運行Apache或Nginx的Linux上設置緩存很簡單。 但是根據我的經驗,Heroku不允許您直接修改服務器配置文件。

如果沒有在服務器上修改.htaccess或nginx.conf的功能,您有兩個選擇:

1-在控制器級別實現rails應用程序的緩存,例如:

def show
  @company = Company.find(params[:id])
  expires_in 3.minutes, :public => true
  # ...
end

這是一個公認的可怕解決方案。

2- Heroku提供的另一個選項是使用Rack :: Cache(Memcachier Heroku附加組件)進行HTTP緩存。 我對此沒有經驗,所以沒有評論。

結論

Heroku提供了一個美妙而簡單的部署環境,但為了提供這種簡單性,他們已經鎖定了配置。 我使用Heroku在測試模式下開發和部署應用程序,但轉移到VPS,我可以實現服務器端優化,例如緩存以啟動應用程序。

PS解決問題的CDN部分:由於是您的服務器設置響應頭,我不認為CDN配置會影響緩存。

您的資產通過您的rails應用程序提供。 相關設置是config.action_controller.asset_host ,例如,應將其設置為指向您的cloudfront分發

config.action_controller.asset_host = '//d123467890.cloudfront.net'

這假設您的Cloudfront分發版已配置為為您的資產提供服務(例如,從asset_sync填充的存儲區)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM