2016-09-28 97 views
0

我有一個Rails 4應用程序,允許上傳視頻使用jQuery Dropzone插件和回形針寶石。每個上傳的視頻都被編碼爲多種格式,並使用delayed_pa​​perclip,av-transcoder和sidekiq gems在後臺上傳到Amazon S3。回形針Nginx 504網關超時

對於大多數視頻來說,所有的工作都可以正常工作,但是在上傳達到看起來像dropzone插件的進度條末端時,1.1GB的更大尺寸後,它將返回Nginx 504網關超時。

至於服務器宕機,Rails應用程序上的一對夫婦是在負載平衡器服務器的Nginx的+客運運行(這裏使用Nginx的太)。我沒有在負載均衡器的上游段設置超時,則client_max_body_size設置爲2000M(既對負載均衡和服務器),我試過設置passenger_pool_idle_time到一個較大的值(600),沒有幫助,我也嘗試設置send_timeout(600s),沒有任何區別。

注:當進行這些改變,我做了他們兩個服務器的主機文件,以及負載均衡,始終重啓nginx的事後。

我讀過幾個關於this onethis one類似問題的答案,但仍然無法弄清楚,谷歌也沒有太多的幫助。

對於那些不熟悉整個回形針/ delayed_pa​​perclip過程的人來說,一些額外的筆記,文件被上傳到服務器,然後就用戶而言完成操作,在後臺對視頻進行後處理(編碼/上傳到S3)被推送到Redis作爲一項工作,並且Sidekiq在有時間/資源時處理它。

什麼可能導致此問題?我該如何調試並解決它?

UPDATE

感謝謝爾蓋的回答我是能夠解決的問題。由於我僅限於Paperclip的特定版本,因此我無法將其更新到具有修復程序的最新版本,因此我將在此離開我最終做的事情。

在,我用它來處理我已經添加了下面的代碼engine_name.rb文件覆蓋從回形針在需要固定方法上傳發動機:

Paperclip::AbstractAdapter.class_eval do 
    def copy_to_tempfile(src) 
     link_or_copy_file(src.path, destination.path) 
     destination 
    end 

    def link_or_copy_file(src, dest) 
     Paperclip.log("Trying to link #{src} to #{dest}") 
     FileUtils.ln(src, dest, force: true) # overwrite existing 
     @destination.close 
     @destination.open.binmode 
    rescue Errno::EXDEV, Errno::EPERM, Errno::ENOENT => e 
     Paperclip.log("Link failed with #{e.message}; copying link #{src} to #{dest}") 
     FileUtils.cp(src, dest) 
    end 
    end 

    Paperclip::AttachmentAdapter.class_eval do 
    def copy_to_tempfile(source) 
     if source.staged? 
     link_or_copy_file(source.staged_path(@style), destination.path) 
     else 
     source.copy_to_local_file(@style, destination.path) 
     end 
     destination 
    end 
    end 

    Paperclip::Storage::Filesystem.class_eval do 
    def flush_writes #:nodoc: 
     @queued_for_write.each do |style_name, file| 
     FileUtils.mkdir_p(File.dirname(path(style_name))) 
     begin 
      move_file(file.path, path(style_name)) 
     rescue SystemCallError 
      File.open(path(style_name), "wb") do |new_file| 
      while chunk = file.read(16 * 1024) 
       new_file.write(chunk) 
      end 
      end 
     end 
     unless @options[:override_file_permissions] == false 
      resolved_chmod = (@options[:override_file_permissions] &~ 0111) || (0666 &~ File.umask) 
      FileUtils.chmod(resolved_chmod, path(style_name)) 
     end 
     file.rewind 
     end 

     after_flush_writes # allows attachment to clean up temp files 

     @queued_for_write = {} 
    end 

    private 

    def move_file(src, dest) 
     # Support hardlinked files 
     if File.identical?(src, dest) 
     File.unlink(src) 
     else 
     FileUtils.mv(src, dest) 
     end 
    end 

    end 
+0

只是試圖從等式中得出這個結論。什麼是服務器規範?你有沒有嘗試增加服務器資源?我從經驗中得知,回形針即使在圖像上也是一個非常苛刻的過程。我最近添加了視頻功能到我的其中一個應用程序(https://games.directory GIF到MP4),我不得不縮放,因爲在解碼GIF時加載回形針正在生成。我也使用nginx,但使用Rails 5和Puma。 – Vlad

+0

CPU:8 RAM:8GB HDD:50GB – Julien

+0

您是否設法解決該問題?我面對同一個問題,無法找出解決方案。 –

回答

0

我前一段時間遇到了類似的問題。也許,我的經驗會有所幫助。

我們有m3.medium實例在亞馬遜與4Gb的內存。 用戶可以上傳大型視頻文件。上傳大於400Mb的文件時,我們遇到了504錯誤問題。

在監控和記錄上傳過程就顯得回形針創建每附件4個文件,從而在文件系統上的所有實例資源方面的工作。 在這裏有這個問題

https://github.com/thoughtbot/paperclip/issues/1642

的描述,並提出瞭解決方案 - 使用時鏈接,而不是文件的可能。你可以在這裏看到相應的代碼更改

https://github.com/arnonhongklay/paperclip/commit/cd80661df18d7cd112944bfe26d90cb87c928aad

然而3天前回形針被更新到5.2.0版本,他們實施了類似的解決方案。 因此,現在它只爲每個附件創建一個文件。因此,我們的文件系統不會超載,更新到5.2.0版本後,我們停止接收504錯誤。

結論:從上面如果你在回形針版本限制出於某種原因

  • 更新回形針5.2.0版本附鏈接

    1. 使用猴子補丁。應該幫助。
  • +0

    謝謝,請看看這個,讓你知道它是否有效 – Julien