10

我有一个下载链接,该链接指向使用 send_file 的控制器中的方法,以便我可以重命名文件(它是一个以 uuid 作为文件名的 MP3)。单击链接后,我在 NGINX 日志和 Rails 日志中看到了该请求,但是在下载之前最多需要 90 秒。我已经尝试了 proxy_buffers 和 client_*_buffers 的各种设置,但没有任何影响。我有一个 HTML5 音频播放器,它使用文件的真实 URL 并立即流式传输文件,没有延迟。

我的 NGINX 配置:

upstream app {
  server unix:/home/archives/app/tmp/unicorn.sock fail_timeout=0;
}

server {
  listen      80 default deferred;
  server_name archives.example.com;
  root        /home/archives/app/public/;

  client_max_body_size 200M;
  client_body_buffer_size 100M;
  proxy_buffers 2 100M;
  proxy_buffer_size 100M;
  proxy_busy_buffers_size 100M;

  try_files /maintenance.html $uri/index.html $uri.html $uri @production;

  location @production {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
    proxy_set_header X-Accel-Mapping /home/archives/app/public/uploads/audio/=/uploads/audio/;
    proxy_redirect off;
    proxy_pass http://app;
  }

  location ~ "^/assets/*" {
    gzip_static on;
    expires     max;
    add_header  Cache-Control public;
  }

  location ~ (?:/\..*|~)$ {
    access_log off;
    log_not_found off;
    deny all;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /home/archives/app/public;
  }
}

导轨控制器:

def download
  send_file @audio.path, type: @audio_content_type, filename: "#{@audio.title} - #{@audio.speaker.name}"
end
4

2 回答 2

0

也许它很慢,因为您设置了一个过大的代理缓冲区?100M 代理缓冲区意味着您的服务器将在开始将其发送到目的地之前从原始数据下载 100M。默认值为 32kB,而 512kB 之类的已经是一个不错的数字了。

于 2018-01-31T00:46:42.970 回答
0

经过测试,我发现是turbolinks导致了这个问题。它在后台执行 XHR 请求,首先下载文件,然后允许浏览器实际下载文件。在我的链接中添加 'data-no-turbolink'='true' 后,立即下载文件。

于 2018-02-12T23:13:06.460 回答