我有一个生产服务器与nginx – >独angular兽 – >铁轨。 我预先编译的资产,把资产放在公共/资产与指纹(哈希)追加到文件名。 但是,当请求网页时,对application.css和application.js资源的引用将具有错误的指纹。 例如,rails helper stylesheet_link_tag将生成一个文件名,这个文件名在服务器的public / assets中不存在,因为请求的指纹与预编译的指纹不匹配。 图像资产工作正常(指纹匹配)。
对此进行故障排除,我在本地机器上预编译了资源,指纹与我服务器上的预编译指纹相匹配。 而且,在生产模式下使用webrick在本地运行时,一切正常。 然后我尝试在我的服务器上运行webrick,这使得我认为独angular兽是问题的根源。
我已经用–no-default-middleware(或-N)选项启动独angular兽来解决这个问题,并且这使得独angular兽像预编译的资产一样按预期行事。 我的理解是,这告诉独angular兽不要加载一个默认的Rack中间件,否则它会加载。 但是,我不明白为什么这个问题能够解决,或者是出了什么问题。 到底是怎么回事?
一些细节:Ubuntu 12.04,Rails 4.0.1,Ruby 2.1.0,带有第三方主题的bootstrap 3.0
更新:
我不相信这是一个nginx问题的原因是,当我从浏览器请求页面,然后查看源文件,application.css文件的文件名具有指纹,所以它实际上看起来像application-3855b1928b94aa5bff5e1dac1aa56882。 CSS。 这与我的服务器上的文件的真实指纹不匹配。 我确信服务器上的指纹是正确的,因为我在本地开发机器上得到了相同的指纹。 所以客户端正在加载网页,然后询问服务器的.css文件… nginx收到该请求,但无法find.css文件,因为它实际上不在那里,所以nginx行为如预期。
指纹产生两次:一次当我预编译资产,这是正常工作(很确定),并没有独angular兽参与发生。 第二次,当一个独angular兽工作人员看到stylesheet_link_tag助手的轨道并dynamic计算指纹(我认为这就是它在做什么),由于某种原因,这些指纹产生了不正确的指纹。 如果我在同一台服务器上用webrickreplace独angular兽,同样的过程也会发生,但是在这种情况下,指纹是匹配的。 如果我用-N旗启动独angular兽,指纹相匹配,但我不知道为什么这会有所作为,我不知道为什么没有人似乎必须这样做。
在导轨4中,您需要进行以下更改
config.assets.compile = true config.assets.precompile = ['*.js', '*.css', '*.css.erb']
这与我工作。 使用以下命令预先编译资产
RAILS_ENV=production bundle exec rake assets:precompile
从https://stackoverflow.com/questions/18700219/rails-4-assets-not-loading-in-production