由独角兽提供服务的Rails为预编译资产生成错误的指纹

时间:2014-05-14 06:46:39

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline rack unicorn

我有一个带nginx的生产服务器 - >独角兽 - >轨道。我预编译资产,将资产放在公共/资产中,并在文件名后附加指纹(哈希)。但是,当请求网页时,对application.css和application.js资产的引用将具有错误的指纹。例如,rails helper stylesheet_link_tag将生成服务器上public / assets中不存在的文件名,因为请求的指纹与预编译的指纹不匹配。图像资产工作正常(指纹匹配)。

对此进行故障排除,我在本地计算机上预编译了资产,指纹与我服务器上的预编译指纹相匹配。此外,当在生产模式下使用webrick在本地运行时,一切正常。然后我尝试在我的服务器上运行webrick,这有效,让我觉得独角兽是问题的根源。

我通过使用--no-default-middleware(或-N)选项启动unicorn解决了这个问题,这使得独角兽的行为与预编译资产相同。我的理解是,这告诉独角兽不要加载一个默认的Rack中间件集,否则它会加载。但是,我真的不明白为什么这会解决问题,或者首先出现问题。发生了什么事?

一些细节:Ubuntu 12.04,Rails 4.0.1,Ruby 2.1.0,带有第三方主题的bootstrap 3.0

更新

我不相信这是一个nginx问题的原因是,当我从浏览器请求页面,然后查看源代码时,application.css文件的文件名有指纹,所以它实际上看起来像应用程序-3855b1928b94aa5bff5e1dac1aa56882.css。这与我服务器上文件的真实指纹不匹配。我确信服务器上的指纹是正确的,因为我在本地开发机器上获得了相同的指纹。所以客户端正在加载网页,然后向服务器询问.css文件... nginx接收到该请求,但找不到.css文件,因为它实际上不存在,所以nginx的行为符合预期

指纹生成两次:一旦我预编译资产,这是正常工作(非常肯定),并且正在发生没有独角兽参与。第二次,当独角兽工作者的上下文中的rails看到stylesheet_link_tag帮助器并且即时计算指纹时(我认为这就是它正在做的事情),这由于某种原因产生了错误的指纹。如果我在完全相同的服务器上用webrick替换unicorn会发生同样的过程,但在这种情况下指纹匹配。如果我用-N标志开始独角兽,指纹匹配,但我不知道为什么这会有所不同,我不知道为什么其他人似乎不必这样做。

2 个答案:

答案 0 :(得分:0)

一个疯狂的猜测:检查Unicorn是否实际在服务器上的生产环境中运行。

答案 1 :(得分:-1)

即使我们面临同样的问题,资产编译成功但事情没有按预期发挥作用。我们发现独角兽是这里的罪魁祸首。与您的情况相同,即使我们曾经在编译资产后重启unicorn。注意到,当重新启动unicorn时,只重新启动其工作进程而不是主进程。这是未提供正确资产的主要原因。之后,在编译资产之后,我们停止并启动了独角兽,以便重新启动独角兽主进程并获得正确的资产。与重新启动独角兽相比,停止和启动独角兽会导致大约10秒的停机时间。这是一种解决方法,可用于长期解决方案从独角兽迁移到美洲狮的地方。