0

У меня есть приложение Rails 4, которое позволяет загружать видео, используя плагин jQuery Dropzone и драгоценный камень скрепки. Каждое загруженное видео кодируется в несколько форматов и загружается в Amazon S3 в фоновом режиме с использованием delayed_paperclip, av-transcoder и sidekiq gems.Paperclip Nginx 504 Тайм-аут шлюза

Все работает отлично с большинством видео, но с более высоким размером, например, 1,1 ГБ после того, как загрузка достигает того, что кажется концом индикатора выполнения плагина dropzone, оно возвращает тайм-аут шлюза Nginx 504.

Что касается сервера, приложение rails работает на Nginx + Passenger на нескольких серверах, которые находятся за балансировщиком нагрузки (здесь также используется Nginx). У меня нет тайм-аутов, установленных в верхнем разделе балансировки нагрузки, client_max_body_size установлен в 2000M (как на балансировщике нагрузки, так и на серверах), я пробовал установку passenger_pool_idle_time на большое значение (600), что не помогло , Я также попытался установить send_timeout (600s), ничего не изменилось.

Примечание. При внесении этих изменений я делал их на файлах хоста обоих серверов, а также на балансировщике нагрузки и всегда перезапускал nginx.

Я также прочитал несколько ответов относительно аналогичных проблем, таких как this one и this one, но все еще не могу понять это, google также не очень полезен.

Некоторые дополнительные заметки для тех, кто не знаком со всем процессом скрепки/delayed_paperclip, файл загружается на сервер, а затем операция выполняется в зависимости от пользователя, в фоновом режиме - после обработки видео (кодирование/uploading to 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 to MP4), и мне пришлось масштабировать из-за того, что пакет paperclip загружался при декодировании GIF. Я также использую nginx, но с Rails 5 и Puma. – Vlad

+0

CPU: 8 ОЗУ: 8GB HDD: 50GB – Julien

+0

Вам удалось решить проблему? Я столкнулся с тем же и не мог понять решение. –

ответ

0

я столкнулся с аналогичной проблемой некоторое время назад. Может быть, мой опыт поможет.

У нас было m3.medium экземпляр на Amazon с 4Gb памяти. Пользователь может загружать большие видеофайлы. Мы столкнулись с проблемой ошибки 504 при загрузке файлов размером более 400 МБ.

Во время мониторинга и регистрации процесса загрузки оказалось, что Paperclip создает 4 файла на вложение и, следовательно, все ресурсы экземпляра работают в файловой системе. Здесь есть описание этой проблемы

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

и предложил решение - использовать ссылки вместо файлов, когда это возможно.Вы можете увидеть соответствующий код изменения здесь

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

Однако 2 дня назад Скрепка был обновлен до 5.2.0 версии, и они реализованы аналогичные решения. Так что теперь он создает только один файл для каждого приложения. Таким образом, наша файловая система не перегружена, и после обновления до версии 5.2.0 мы перестали получать ошибку 504.

Вывод:

  1. Использование обезьяны патч по ссылке прикрепленного выше, если вы ограничены в Paperclip версии по какой-то причине
  2. Update Paperclip до 5.2.0 версии. Должен помочь.
+0

спасибо, посмотрим на это и сообщите, если он сработает – Julien