在 Rails / Cloudfront / Heroku 中设置资产缓存过期

Setting Asset Cache Expiration in Rails / Cloudfront / Heroku

我收到来自 Google pagespeed 工具的错误消息,提示我的资源未指定缓存过期时间。

我通过云端提供断言,我的网站(Ruby 在 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)

首先,cloudfront 似乎没有提供服务。第二个:

这是云端问题、heroku 问题还是 rails 问题?它可以通过编程方式解决,还是我需要 fiddle 使用 heroku/cloudfront 设置?

您的资产正在通过您的 rails 应用提供。相关设置是 config.action_controller.asset_host 应该设置为指向您的云端分布,例如

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

这假设您的云端分配已配置为服务您的资产(例如来自由 asset_sync 填充的存储桶)

设置响应header

要启用浏览器缓存,您必须设置 Cache-Control 和过期响应 header。

调试提示

要查看您现有的缓存设置,请使用浏览器的调试器。对于 Chrome,在您应用的任何页面上,打开调试器并查看:

查看您的代码更改会产生什么影响很重要。 运行 按原样在您的应用程序上执行此操作并获得基线响应 header。


设置响应headers

当您有权访问服务器配置文件时,在 Linux 运行 Apache 或 Nginx 上设置缓存很简单。但根据我的经验,Heroku 不允许您直接修改服务器配置文件。

如果无法在服务器上修改 .htaccess 或 nginx.conf,您有 2 个选择:

1- 在控制器级别为您的 rails 应用实施缓存,例如:

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

这是一个公认的可怕解决方案。

2- Heroku 提供的另一个选项是使用 Rack::Cache (Memcachier Heroku add-on) 的 HTTP 缓存。我没有这方面的经验,所以不发表评论。

结论

Heroku 提供了一个美妙而简单的部署环境,但为了提供这种简单性,他们锁定了配置。我使用 Heroku 在测试模式下开发和部署应用程序,但转移到 VPS,我可以在其中实施服务器端优化,例如缓存以启动应用程序。

P.S. 解决问题的 CDN 部分:因为这是您的服务器设置响应 headers,我不认为CDN 配置影响缓存。