2013-10-12 13 views
10

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 
+0

avete 'config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # per NGINX' commentato nella configurazione dell'ambiente? – hamitron

+0

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

risposta

0

Dopo il test, ho scoperto che erano i turbolinks a causare il problema. Stava facendo una richiesta XHR in background, scaricando prima il file e poi permettendo al browser di scaricare effettivamente il file. Dopo aver aggiunto "data-no-turbolink" = "true" al mio collegamento, scaricare i file immediatamente.

0

Forse è lento perché è stato impostato un buffer di delega eccessivamente grande? Il buffer proxy da 100 M indica che il server scaricherà 100 M dai dati di origine prima di iniziare a inviarlo alla destinazione. Il valore predefinito è 32kB e qualcosa come 512kB sarebbe già un bel numero.