我有一个下载链接转到控制器中使用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;
}
}
Rails控制器:
def download
send_file @audio.path, type: @audio_content_type, filename: "#{@audio.title} - #{@audio.speaker.name}"
end
答案 0 :(得分:0)
也许它很慢,因为你设置了一个过大的代理缓冲区? 100M代理缓冲区意味着您的服务器将在开始将其发送到目标之前从源数据下载100M。默认值为32kB,像512kB这样的数字已经很不错了。
答案 1 :(得分:0)
经过测试,我发现这是导致问题的涡轮连接。它在后台执行XHR请求,首先下载文件然后允许浏览器实际下载文件。添加' data-no-turbolink' =' true'到我的链接,立即下载文件。