У меня есть приложение 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
Просто пытаюсь получить это из уравнения. Что такое серверная спецификация? Вы пытались увеличить ресурсы сервера? Я знаю по опыту, что скрепка является очень требовательным процессом даже с изображениями. Недавно я добавил возможности видео в одно из моих приложений (https://games.directory GIF to MP4), и мне пришлось масштабировать из-за того, что пакет paperclip загружался при декодировании GIF. Я также использую nginx, но с Rails 5 и Puma. – Vlad
CPU: 8 ОЗУ: 8GB HDD: 50GB – Julien
Вам удалось решить проблему? Я столкнулся с тем же и не мог понять решение. –