J'ai une application Rails 4 qui permet de télécharger des vidéos en utilisant le plugin jQuery Dropzone et la gemme trombone. Chaque vidéo mise en ligne est encodée en plusieurs formats et téléchargée en arrière-plan sur Amazon S3 à l'aide des gemmes delayed_paperclip, av-transcoder et sidekiq.Paperclip Nginx 504 Gateway Time-out
Tout fonctionne correctement avec la plupart des vidéos, mais avec une taille plus élevée de 1,1 Go après que le téléchargement atteigne la fin de la barre de progression du plugin dropzone, il renvoie un délai d'attente de la passerelle Nginx 504.
En ce qui concerne le serveur, l'application rails est exécutée sur Nginx + Passenger sur deux serveurs qui se trouvent derrière un équilibreur de charge (Nginx utilisé ici aussi). Je n'ai pas de délais d'attente définis dans la section amont de l'équilibreur de charge, le client_max_body_size
est réglé sur 2000M (à la fois sur l'équilibreur de charge et les serveurs), j'ai essayé de définir passenger_pool_idle_time
sur une valeur élevée (600), cela n'a pas aidé , J'ai également essayé de mettre send_timeout
(600s), rien n'a fait de différence.
Remarque: Lors de ces modifications, je les ai effectuées sur les fichiers hôte des deux serveurs ainsi que sur l'équilibreur de charge et j'ai toujours redémarré nginx par la suite.
J'ai lu aussi plusieurs réponses concernant des problèmes similaires comme this one et this one mais je n'arrive toujours pas à comprendre cela, google n'était pas beaucoup plus utile non plus.
Quelques notes supplémentaires pour ceux qui ne connaissent pas l'ensemble du processus paperclip/delayed_paperclip, le fichier est téléchargé sur le serveur puis l'opération est effectuée pour l'utilisateur, en arrière-plan le post-traitement des vidéos (encodage/uploading to S3) est envoyé à Redis en tant que travail et Sidekiq le traite chaque fois qu'il dispose de temps/ressources.
Ce qui pourrait être à l'origine de ce problème? Comment puis-je déboguer cela et le résoudre?
MISE À JOUR
Merci à la réponse de Sergey j'ai pu résoudre le problème. Comme je me limitais à une version spécifique de Paperclip, je ne pouvais pas la mettre à jour avec la nouvelle version qui a le correctif, donc je vais laisser ici ce que j'ai fini par faire.
Dans le moteur que je l'utilise pour gérer les ajouts que j'ai ajouté le code suivant dans le fichier engine_name.rb
pour remplacer les méthodes de Paperclip qui avaient besoin de fixation:
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
Quelle est la spécification du serveur? Avez-vous essayé d'augmenter les ressources du serveur? Je sais par expérience que le trombone est un processus très exigeant même avec des images. J'ai récemment ajouté des capacités vidéo à l'une de mes applications (https://games.directory GIF à MP4) et j'ai dû mettre à l'échelle en raison de la charge que paperclip produisait lors du décodage du GIF. J'utilise aussi nginx mais avec Rails 5 et Puma. – Vlad
Unité centrale: 8 RAM: 8 Go HDD: 50 Go – Julien
Avez-vous réussi à résoudre le problème? J'ai fait face au même et je n'arrive pas à trouver la solution. –