带有 Puma 和 Nginx 服务页面的 Elastic Beanstalk 上预编译资产的 Rails 4 应用程序以及旧资产链接
Posted
技术标签:
【中文标题】带有 Puma 和 Nginx 服务页面的 Elastic Beanstalk 上预编译资产的 Rails 4 应用程序以及旧资产链接【英文标题】:Rails 4 app with precompiled assets on Elastic Beanstalk with Puma and Nginx serving page with old asset links 【发布时间】:2016-08-08 14:38:22 【问题描述】:我必须在本地预编译资产才能使我的 JS 插件之一正常工作。
每当我对任何资产和预编译进行更改时,我都会在 public/assets 中获得一个新版本,而旧版本也在那里。当我以生产模式在本地运行时,我会看到一个包含新资产的页面。
当我部署到 EB 时,页面总是包含指向旧资产的链接。
当然,application.html.erb 使用的是动态css链接标签:<%= stylesheet_link_tag "application", media: "all" %>
production.rb 包含:
config.action_controller.perform_caching = true
config.assets.compile = true
我认为这一定与 nginx 或 EC2 中对 html 文件的某种缓存有关,因为 puma 在本地运行。
我试过了:
不同的浏览器,PC,清除缓存,禁用缓存。不是浏览器。 在 nginx.conf 中设置发送文件关闭。 将 html 的缓存过期设置为 -1,并通过 curl 确认我收到了 Cache-Control: no-cache 重命名整个应用程序/当前文件夹。我仍然收到一个页面,但它缺少 CSS。服务器启动后实际使用的文件在哪里?rake tmp:clear
在服务器上。
在整个服务器上寻找任何 nginx 或 puma 缓存。我什么也没找到。
在过去 2 年中连续数小时进行研究。
唯一可行的方法是rake assets:clobber
,创建一个新的 EB 环境,然后部署几次。有时,即使这样也行不通。
请帮忙!
【问题讨论】:
【参考方案1】:在又无数小时未能解决此问题后,我注意到 Elastic Beanstalk 配置设置中的一个变量已更改为默认值。 RAILS_SKIP_ASSET_COMPILATION - 因为我试图自己管理资产编译,所以我将其设置为 true。将其转回 false 解决了我的问题并显着增加了我的部署时间。我的第三方 javascripts 和 gems 也都可以正常工作。
我仍然认为这是一种解决方法,因为我应该能够手动预编译。不过,这对我来说已经足够了。
【讨论】:
【参考方案2】:我在暂存或生产服务器上缓存资产时遇到了类似的问题。当我检查资产文件的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'
希望这将帮助您或至少提供一些指导。
【讨论】:
感谢您的建议。我更改了版本,资产全部重新编译,但没有帮助。似乎这与正在提供的实际 html 有关。它仍在尝试链接到旧版本。 您的 html 仍在使用旧指纹指向(尝试提供)资产,据我了解,更改资产版本应强制应用程序生成指向具有新指纹的资产的 html。我唯一想到的是尝试重新启动服务器,但如果它在部署期间已经完成,那么我不知道可能是什么问题:(以上是关于带有 Puma 和 Nginx 服务页面的 Elastic Beanstalk 上预编译资产的 Rails 4 应用程序以及旧资产链接的主要内容,如果未能解决你的问题,请参考以下文章
使用 puma nginx 和 capistrano 设置 ROR 应用程序
使用 Nginx、Puma 和 Redis 部署 Rails 5 Action Cable
502 bad gateway nginx + puma + rails 3.2 on Elastic Beanstalk