Загрузка NGINX начинается медленно с send_file

У меня есть ссылка для загрузки, которая идет на метод в контроллере, который использует send_file, чтобы я мог переименовать файл (это MP3 с uuid как имя файла). После нажатия на ссылку я вижу запрос в журналах NGINX и Rails, однако до загрузки существ занимает до 90 секунд. Я пробовал различные настройки с proxy_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

Ответ 1

После тестирования я узнал, что это проблема turbolinks. Он выполнял запрос XHR в фоновом режиме, сначала загружая файл, а затем позволяя браузеру фактически загружать файл. После добавления 'data-no-turbolink' = 'true' в мою ссылку, файлы загружаются мгновенно.

Ответ 2

Может быть, он медленный, потому что вы установили слишком большой буфер прокси-сервера? 100M прокси-буфер означает, что ваш сервер будет загружать 100M из исходных данных, прежде чем отправлять его в пункт назначения. По умолчанию 32kB, и что-то вроде 512kB будет уже хорошим номером.