2016-04-16 41 views
0

我必須在本地預編譯資產以使我的一個JS插件正常工作。Rails 4應用程序在Elastic Beanstalk上的預編譯資產與Puma和Nginx服務頁面與舊資產鏈接

每當我對任何資產和預編譯進行更改時,我都會在公共/資產中獲得新版本,而舊版本也在那裏。當我在生產模式下本地運行時,我會爲新資產提供一個頁面。

當我部署到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文件,因爲美洲獅在本地運行。

我曾嘗試:

  • 不同的瀏覽器,PC,清除緩存,禁用緩存。它不是瀏覽器。
  • 在nginx.conf中設置關閉發送文件。
  • 將緩存過期設置爲-1,並通過我收到的curl確認緩存控制:no-cache
  • 將整個應用/當前文件夾重命名。我仍然收到一個頁面,但它缺少CSS。服務器啓動後實際使用的文件在哪裏?
  • rake tmp:clear在服務器上。
  • 在整個服務器上尋找任何nginx或puma緩存。我什麼也沒找到。
  • 在過去的兩年裏對小時進行研究。

有史以來唯一可行的是rake assets:clobber,創建一個新的EB環境,並部署幾次。有時候,即使這樣也行不通。

請幫忙!

回答

0

我在緩存或生產服務器上緩存資產時遇到類似問題。當我檢查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' 

希望這會幫助您或至少提供一些指導。

+1

感謝您的建議。我改變了版本,資產全部重新編譯,並沒有幫助。它似乎是與正在服務的實際HTML有關。它仍然試圖鏈接到舊版本。 – user1732748

+0

您的html仍然指向(嘗試提供)具有舊指紋的資產,並且據我瞭解,更改資產版本應該強制應用程序生成指向具有新指紋的資產的html。唯一讓我想到的是嘗試重新啓動服務器,但如果它已經在部署期間完成比我不知道什麼可能是一個問題:( –

0

經過無數小時未能解決此問題,我注意到Elastic Beanstalk配置設置中的一個變量,我從默認值更改過。 RAILS_SKIP_ASSET_COMPILATION - 自從我試圖自己管理資產編制時,我將它設置爲true。將此返回false以解決我的問題並顯着增加了我的部署時間。我的第三方JavaScript和寶石也都正常工作。

我仍然認爲這是一種解決方法,因爲我應該可以手動進行預編譯。不過,目前這對我來說已經足夠了。