Activation du codage de transfert en morceaux nginx

17

Il semble que nginx 0.8.35 puisse prendre en charge le codage de transfert par blocs :

Modifications avec nginx 0.8.35 01 avr 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

C'est génial, car j'essaye d'obtenir des modifications push git via un proxy inverse nginx vers un processus git-http-backend. Git HTTP tire parti du codage de transfert par blocs pour des raisons d'efficacité côté client .

Cependant, je ne peux pas le faire fonctionner. J'utilise nginx 0.8.44 sur Debian Lenny avec l'invocation de configuration suivante:

./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

Et le fichier de conf suivant:

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

Et mon proxy.conflook ressemble à ceci:

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;

(À l'origine, j'ai posté cette question sur Stack Overflow mais on m'a dit qu'elle était plus appropriée à la défaillance du serveur)

rentzsch
la source
1
Vous ne pouvez pas avoir de tampons ni d'encodage fragmenté. Les tampons attendent d'envoyer des données, les blocs doivent les envoyer immédiatement.
Martin Fjordvald
Apparemment, Nginx prend en charge Chunked depuis la version 1.3.9 (27/11/2012). Cependant, je reçois toujours des messages d'erreur «411 Longueur requise» lorsqu'un smartphone envoie des requêtes POST en bloc à mon serveur Nginx. Aucun conseil?
Meir

Réponses:

25

C'est une vieille question, je sais, mais elle est venue à la recherche du problème (que j'ai passé l'après-midi à essayer de résoudre). Le commentaire de Martin F m'a donné suffisamment d'indices pour le faire fonctionner!

L'astuce consiste à définir proxy_buffering off;dans votre bloc de localisation. En supposant que votre serveur en amont renvoie des réponses fragmentées, nginx enverra les morceaux individuels au client - même en les compressant à la volée si la compression de sortie gzip est activée.

Notez que la désactivation de la mise en mémoire tampon peut avoir d'autres inconvénients, alors n'allez pas aveuglément désactiver la mise en mémoire tampon sans comprendre pourquoi.

John Dalton
la source
9

Je suggère de modifier votre question pour clarifier. Il y a une grande différence entre les requêtes fragmentées et les réponses fragmentées. La réponse de John Dalton s'adresse à ce dernier. Git fait les deux.

Nginx ne prend actuellement pas en charge les requêtes POST fragmentées et cette publication apparaît en haut dans les résultats de recherche sur le sujet. Les requêtes POST fragmentées sont utilisées lorsque vous ne connaissez pas la quantité de données téléchargées à l'avance et sont fréquemment utilisées par les téléphones mobiles.

La seule solution de travail que j'ai trouvée est la suivante:

http://wiki.nginx.org/HttpChunkinModule

Malheureusement, cela nécessite de recompiler nginx car nginx ne prend pas en charge les modules chargeables.

Roger Binns
la source
Je suis d'accord: je trouve que HttpChunkinModule est la seule solution de contournement théorique ... mais ce n'est pas possible pour moi dans ma situation. Est-ce que quelqu'un sait si autre chose peut être fait? (Des changements depuis le 30 janvier 2011?)
mdahlman
1
Pas de changements que je connaisse. Je viens de faire une recompilation nginx l'autre jour afin de permettre cela.
Roger Binns
2

Sur mon cas ... j'essaye beaucoup de choses et finalement je n'ai qu'à ajouter à la configuration

proxy_http_version 1.1;

Et il fonctionne...

Cesar Gallego
la source
Je devais ajouter proxy_set_header Connection "";... réponse originale de -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
Cela a également fonctionné pour moi. Mais je ne comprends vraiment pas pourquoi.
Jeff
Mise à jour de mon dernier commentaire .... cela a fonctionné parce que mon serveur en amont utilisait le codage de transfert en bloc, qui a été introduit dans HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). La version par défaut du protocole http pour le proxy nginx est 1.0.
Jeff
1

D'autres réponses étaient valides, mais c'est une vieille question.

Il semble que les transferts par blocs soient pris en charge par nginx 1.3.9 [1], qui a été publié mi-2013 je pense.

[1] http://wiki.nginx.org/HttpChunkinModule

sandstrom
la source