我有一個帶有 nginx -> unicorn -> Rails 的生產伺服器。我預編譯資產,將資產放入公共/資產中,並在檔案名稱後面附加指紋(哈希)。但是,當請求網頁時,對 application.css 和 application.js 資源的參考將具有錯誤的指紋。例如,rails 幫助程式 stylesheet_link_tag 將產生一個在伺服器上的 public/assets 中不存在的檔案名,因為請求的指紋與預先編譯的指紋不符。影像資源運作正常(指紋匹配)。
為了解決這個問題,我在本機電腦上預先編譯了資產,並且指紋與我的伺服器上的預編譯指紋相符。此外,當在生產模式下使用 webrick 在本地運行時,一切正常。然後我嘗試在我的伺服器上運行 webrick,它起作用了,這讓我認為 unicorn 是問題的根源。
我透過使用 --no-default-middleware (或 -N)選項啟動 unicorn 解決了這個問題,這使得 unicorn 對於預編譯資產的行為符合預期。我的理解是,這告訴 unicorn 不要載入預設的 Rack 中間件集,否則它會載入。但是,我真的不明白為什麼這可以解決問題,或者首先出了什麼問題。到底是怎麼回事?
一些細節:Ubuntu 12.04、Rails 4.0.1、Ruby 2.1.0、帶有第三方主題的 bootstrap 3.0
更新:
我不認為這是 nginx 問題的原因是,當我從瀏覽器請求頁面,然後查看原始程式碼時,application.css 檔案的檔案名稱具有指紋,因此它實際上看起來像 application-3855b1928b94aa5bff5e1dac1aa56882。這與我的伺服器上檔案的真實指紋不符。我確信伺服器上的指紋是正確的,因為我在本機開發電腦上得到了相同的指紋。因此,客戶端正在載入網頁,然後向伺服器請求 .css 文件...nginx 收到該請求,但找不到 .css 文件,因為它實際上不存在,因此 nginx 的行為符合預期。
指紋產生兩次:一次是在我預編譯資產時,它工作正常(非常確定),並且是在沒有獨角獸參與的情況下發生的。第二次,當獨角獸工作者上下文中的 Rails 看到 stylesheet_link_tag 幫助程式並即時計算指紋時(我認為這就是它正在做的事情),由於某種原因,這會產生不正確的指紋。如果我在同一台伺服器上用 webrick 取代 unicorn,也會發生相同的過程,但在這種情況下指紋匹配。如果我用 -N 標誌啟動 unicorn,指紋會匹配,但我不知道為什麼這會產生影響,而且我不知道為什麼其他人似乎必須這樣做。
答案1
在 Rails 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-product