Rails 4 app在Elastic Beanstalk上使用预编译资产,Puma和Nginx服务页面包含旧资产链接

时间:2016-04-16 17:14:08

标签: ruby-on-rails caching nginx elastic-beanstalk puma

我必须在本地预编译资源,以便我的一个JS插件正常工作。

每当我对任何资产和预编译进行更改时,我都会在公共/资产中获得一个新版本,旧版本也在那里。当我在生产模式下本地运行时,我将获得一个包含新资产的页面。

当我部署到EB时,页面始终包含指向旧资产的链接。

当然,application.html.erb使用动态css链接标记:<%= stylesheet_link_tag "application", media: "all" %>

production.rb包含:

config.action_controller.perform_caching = true
config.assets.compile = true

我认为这必须与Nginx或html文件中的EC2中的某种缓存有关,因为puma在本地运行。

我试过了:

  • 不同的浏览器,PC,清除缓存,禁用缓存。它不是浏览器。
  • 在nginx.conf中设置发送文件。
  • 为html设置缓存过期为-1,并通过curl确认我收到了Cache-Control:no-cache
  • 重命名整个app / current文件夹。我仍然收到一个页面,但它缺少CSS。服务器启动后实际使用的文件在哪里?
  • 服务器上的
  • rake tmp:clear
  • 在服务器上查找任何nginx或puma缓存。我一无所获。
  • 过去两年研究了几个小时。

唯一有效的方法是rake assets:clobber,创建新的EB环境,并部署几次。有时候,即使这样也行不通。

请帮忙!

2 个答案:

答案 0 :(得分:0)

我在登台或生产服务器上缓存资产时遇到了类似的问题。当我检查资产文件的Last-Modified属性时,例如curl -I http://url-to-the-asset-file服务器返回旧(缓存)文件。

解决问题的方法是更新production.rb文件中的资产版本。它将强制资产使用新的MD5哈希指纹重新编译。

# config/environments/production.rb

# Version of your assets, change this if you want to expire all your assets.
config.assets.version = '1.1'

希望这对您有所帮助或至少给予一些指导。

答案 1 :(得分:0)

经过无数个小时未能解决这个问题之后,我注意到Elastic Beanstalk配置设置中的一个变量,我从默认值改变了。 RAILS_SKIP_ASSET_COMPILATION - 我将其设置为true,因为我自己试图管理资产编译。将此重新设置为false可修复我的问题,并显着增加了部署时间。我的第三方javascripts和宝石也都正常工作。

我仍然认为这是一种解决方法,因为我应该能够手动预编译。但是,这对我来说已经足够了。