Abilitazione della codifica di trasferimento Chunked di nginx


17

Sembra che nginx 0.8.35 possa supportare la codifica di trasferimento in blocchi :

Modifiche con nginx 0.8.35 del 01 aprile 2010

*) Change: now the charset filter runs before the SSI filter.

*) Feature: the "chunked_transfer_encoding" directive.

Questo è fantastico, perché sto cercando di ottenere modifiche push git tramite un proxy inverso nginx a un processo back-end git-http. Git HTTP sfrutta la codifica di trasferimento chunked per motivi di efficienza sul lato client .

Tuttavia, non riesco a farlo funzionare. Sto usando nginx 0.8.44 su Debian Lenny con il seguente richiamo di configurazione:

./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--user=www-data \
--group=www-data \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module

E il seguente file conf:

server {
    server_name example.com;
    location / {
        proxy_pass  http://192.168.0.10;
        include     /etc/nginx/proxy.conf;
        chunked_transfer_encoding on;
    }
}

E il mio proxy.confassomiglia a questo:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100M;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

(Inizialmente avevo pubblicato questa domanda su Stack Overflow ma mi è stato consigliato che è più appropriato per Server Fault)


1
Non è possibile avere buffer o codifica chunked. I buffer attendono di inviare i dati, i blocchi dovrebbero essere inviati immediatamente.
Martin Fjordvald,

Apparentemente Nginx supporta Chunked dalla versione 1.3.9 (27/11/2012). Tuttavia, ricevo ancora messaggi di errore "Lunghezza richiesta 411" quando uno smartphone invia richieste POST in blocco al mio server Nginx. Qualche consiglio?
Meir,

Risposte:


25

Questa è una vecchia domanda, lo so, ma è emersa nella ricerca del problema (che ho trascorso il pomeriggio cercando di risolvere). Il commento di Martin F mi ha dato abbastanza indizio per farlo funzionare!

Il trucco è impostare proxy_buffering off;il blocco della posizione. Supponendo che il server upstream stia inviando risposte a blocchi, questo farà sì che nginx rispedisca i singoli blocchi al client, anche se li gzip al volo se hai attivato la compressione dell'output di gzip.

Si noti che la disattivazione del buffering può avere altri svantaggi, quindi non andare alla cieca disattivando il buffering senza capire il perché.


9

Suggerisco di modificare la tua domanda per chiarire. C'è una grande differenza tra le richieste in blocco e le risposte in blocco. La risposta di John Dalton si rivolge a quest'ultimo. Git fa entrambe le cose.

Al momento Nginx non supporta le richieste POST in blocco e questa pubblicazione appare in alto nei risultati di ricerca sull'argomento. Le richieste POST Chunked vengono utilizzate quando non si conosce la quantità di dati caricati in anticipo e vengono spesso utilizzati dai telefoni cellulari.

L'unica soluzione funzionante che ho trovato è questa:

http://wiki.nginx.org/HttpChunkinModule

Sfortunatamente richiede la ricompilazione di nginx poiché nginx non supporta i moduli caricabili.


Sono d'accordo: sto scoprendo che HttpChunkinModule è l'unica soluzione teorica ... ma non è aperto a me nella mia situazione. Qualcuno sa se si può fare qualcos'altro? (Eventuali modifiche dal 30 gennaio 2011?)
mdahlman,

1
Nessun cambiamento che conosco. L'altro giorno ho appena fatto una ricompilazione di nginx per abilitarlo.
Roger Binns,

2

Nel mio caso ... provo molte cose e alla fine ho solo bisogno di aggiungere alla configurazione

proxy_http_version 1.1;

E funziona ...


Ho dovuto aggiungere proxy_set_header Connection "";... risposta originale da -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich,

Questo ha funzionato anche per me. Ma davvero non capisco perché.
Jeff,

Aggiornamento al mio ultimo commento .... ha funzionato perché il mio server upstream utilizzava Chunked Transfer Encoding, introdotto in HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). La versione predefinita del protocollo http per il proxy nginx è 1.0.
Jeff,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.