2012-09-05 33 views
33

Ho configurato nginx come proxy inverso sulla mia applicazione node.js per upload di file con direttiva proxy_pass. Funziona, ma il mio problema è che nginx aspetta che l'intero corpo del file venga caricato prima di passarlo all'upstream. Questo mi crea problemi, perché voglio tenere traccia dell'avanzamento del caricamento sulla mia applicazione. Qualche idea su come configurare nginx per lo streaming del corpo del file in tempo reale fino al monte?file nginx upload streaming con proxy_pass

+0

Hai avuto alcuna soluzione per questo? – Sreeraj

risposta

26

Non v'è alcun modo per (almeno fin d'ora). La richiesta completa sarà sempre memorizzata nel buffer prima che nginx inizi a inviarlo a monte. Per tracciare i file caricati puoi provare il modulo upload progress.

Aggiornamento: in nginx 1.7.11 è disponibile la direttiva proxy_request_buffering che consente di disabilitare il buffering di un corpo di richiesta. Dovrebbe essere usato con cura però, vedi i documenti.

+0

Il modulo di avanzamento del caricamento è ottimo, ma stiamo utilizzando diversi server per l'elaborazione dei caricamenti dopo il bilanciamento del carico, quindi c'è sempre la possibilità che la richiesta di aggiornamento del progresso venga instradata su un altro server (anche con alcuni trucchi del bilanciamento del carico). – bbbonthemoon

-3

Ho il sospetto che:

proxy_buffering off; 

è quello che ti serve, vedi http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering

+2

L'ho provato. Purtroppo sembra che questa direttiva funzioni solo per il buffering delle risposte (proprio come descritto) – bbbonthemoon

+4

Ecco un ticket nginx per lo streaming diretto del proxy dei dati di caricamento http://trac.nginx.org/nginx/ticket/251 speriamo che lo implementeranno qualche volta =/ – TekTimmy

5

Tengine (un fork da nginx) supporta il caricamento unbuffered impostando proxy_request_buffering su off.

http://tengine.taobao.org/document/http_core.html

Aggiornato: nel nginx 1.7.11 direttiva proxy_request_buffering è disponibile, come accennato sopra @Maxim Dounin

+0

Anche se proxy_request_buffering è disattivato, la richiesta è ancora memorizzata nel buffer. dal doc: "Quando si disattiva il proxy_request_buffering o fastcgi_request_buffering, Tengine invierà il corpo al backend o riceverà più di client_body_postpone_size dati o l'intero corpo della richiesta è stato ricevuto." –