Ho un collegamento per il download che va a un metodo in un controller che utilizza send_file in modo che io possa rinominare il file (è un MP3 con uuid come nome file). Dopo aver cliccato sul link, vedo la richiesta nei log NGINX e Rails, tuttavia ci vogliono fino a 90 secondi prima che il download sia eseguito. Ho provato varie impostazioni con proxy_buffers e client _ _ _ buffer senza alcun effetto. Dispongo di un lettore audio HTML5 che utilizza l'URL reale per il file e trasmette immediatamente il file senza ritardo.Download NGINX lento per iniziare con send_file
mio Nginx config:
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 regolatore:
def download
send_file @audio.path, type: @audio_content_type, filename: "#{@audio.title} - #{@audio.speaker.name}"
end
avete 'config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # per NGINX' commentato nella configurazione dell'ambiente? – hamitron
Se si sposta il file mp3 nella cartella pubblica, è possibile accedervi direttamente tramite il browser, solo per testare le prestazioni (ignorando la logica del controller). Se è ancora lento, è probabile che si tratti di un problema di configurazione NGINX. Prova anche a eseguire la tua app con webbrick (rails s -b 0.0.0.0) per vedere se questo fa alcuna differenza? – Roger