在 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 配置影响缓存。
我收到来自 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 配置影响缓存。