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

时间:2015-05-26 12:21:02

标签: ruby-on-rails ruby heroku amazon-cloudfront

我从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设置?

2 个答案:

答案 0 :(得分:3)

设置回复标题

要启用浏览器缓存,您必须设置Cache-Control和Expires响应标头。

调试提示

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

enter image description here

了解代码更改会产生什么影响非常重要。按原样在您的应用上运行此操作并获取基线响应标头。

设置回复标题

当您有权访问服务器配置文件时,在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附加组件)进行HTTP缓存。我没有这方面的经验,所以没有评论。

<强>结论

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

P.S。解决问题的CDN部分:由于是您的服务器设置响应标头,我不认为CDN配置会影响缓存。

答案 1 :(得分:0)

您的资产通过您的rails应用程序提供。相关设置为config.action_controller.asset_host,应将其设置为指向您的Cloudfront分配,例如

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

这假设您的Cloudfront分配已配置为您的资产提供服务(例如,来自由asset_sync填充的存储区)