带有 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 应用程序以及旧资产链接的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 渲染 502 错误页面

为啥我需要 Nginx 和 Puma?

使用 SSL 和 Nginx 运行 Puma

使用 puma nginx 和 capistrano 设置 ROR 应用程序

使用 Nginx、Puma 和 Redis 部署 Rails 5 Action Cable

502 bad gateway nginx + puma + rails 3.2 on Elastic Beanstalk