Nginx Chunked Transfer Encoding aktivieren

17

Es sieht so aus, als ob Nginx 0.8.35 Chunked Transfer Encoding unterstützen könnte :

Änderungen mit nginx 0.8.35 01 Apr 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Das ist großartig, weil ich versuche, Push-Git-Änderungen über einen Nginx-Reverse-Proxy zu einem Git-http-Backend-Prozess zu bekommen. Git HTTP nutzt die Chunk-Übertragungscodierung aus Gründen der Effizienz auf der Clientseite .

Ich kann es jedoch nicht zum Laufen bringen. Ich verwende Nginx 0.8.44 unter Debian Lenny mit dem folgenden Aufruf von configure:

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

Und die folgende conf-Datei:

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

Und meine proxy.confsieht so aus:

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;

(Ursprünglich habe ich diese Frage in Stack Overflow gepostet , aber es wurde empfohlen, dass sie besser für Serverfehler geeignet ist.)

Rentzsch
quelle
1
Sie können weder Puffer noch Blockcodierung verwenden. Puffer warten darauf, Daten zu senden, Chunked sollten sie sofort senden.
Martin Fjordvald
Anscheinend unterstützt Nginx Chunked seit Version 1.3.9 (27.11.2012). Ich erhalte jedoch weiterhin die Fehlermeldung "411 Length Required" (411 Länge erforderlich), wenn ein Smartphone blockierte POST-Anforderungen an meinen Nginx-Server sendet. Irgendein Rat?
Meir

Antworten:

25

Ich weiß, das ist eine alte Frage, aber sie ist auf der Suche nach dem Problem aufgetaucht (das ich am Nachmittag zu lösen versucht habe). Martin Fs Kommentar gab mir genug Anhaltspunkte, um es zum Laufen zu bringen!

Der Trick besteht darin, proxy_buffering off;in Ihrem Standortblock festzulegen. Angenommen, Ihr Upstream-Server sendet Chunk-Antworten zurück, dann sendet Nginx die einzelnen Chunks zurück an den Client. Wenn Sie die Komprimierung der GZIP-Ausgabe aktiviert haben, können Sie sie sogar sofort gzippen.

Beachten Sie, dass das Deaktivieren der Pufferung andere Nachteile haben kann. Deaktivieren Sie die Pufferung also nicht blind, ohne zu wissen, warum.

John Dalton
quelle
9

Ich schlage vor, Ihre Frage zu bearbeiten, um dies zu klären. Es gibt einen großen Unterschied zwischen Teilanforderungen und Teilantworten. John Daltons Antwort spricht Letzteres an. Git macht beides.

Nginx unterstützt derzeit keine gekapselten POST-Anfragen, und dieser Beitrag ist in den Suchergebnissen zu diesem Thema weit verbreitet. Chunked-POST-Anforderungen werden verwendet, wenn Sie nicht wissen, wie viele Daten im Voraus hochgeladen werden, und sie werden häufig von Mobiltelefonen verwendet.

Die einzige funktionierende Lösung, die ich gefunden habe, ist folgende:

http://wiki.nginx.org/HttpChunkinModule

Leider muss nginx neu kompiliert werden, da nginx keine ladbaren Module unterstützt.

Roger Binns
quelle
Ich stimme zu: Ich finde, dass HttpChunkinModule die einzige theoretische Umgehung ist ... aber sie steht mir in meiner Situation nicht offen. Weiß jemand, ob noch etwas getan werden kann? (Änderungen seit dem 30. Januar 2011?)
mdahlman
1
Keine Änderungen, die ich kenne. Ich habe neulich eine Nginx-Neukompilierung durchgeführt, um dies zu ermöglichen.
Roger Binns
2

Auf meinem Fall ... ich versuche eine Menge Dinge und muss schließlich nur zur Konfiguration hinzufügen

proxy_http_version 1.1;

Und es funktioniert...

Cesar Gallego
quelle
Ich musste hinzufügen proxy_set_header Connection "";... ursprüngliche Antwort von -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
Das hat auch bei mir funktioniert. Aber ich verstehe wirklich nicht warum.
Jeff
Update auf meinen letzten Kommentar .... das hat funktioniert, weil mein Upstream-Server Chunked Transfer Encoding verwendete, das in HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ) eingeführt wurde. Die Standard-HTTP-Protokollversion für Nginx-Proxy ist 1.0.
Jeff
1

Andere Antworten waren früher gültig, aber dies ist eine alte Frage.

Chunked Transfers werden anscheinend nach Nginx 1.3.9 [1] unterstützt, das meiner Meinung nach Mitte 2013 veröffentlicht wurde.

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

Sandstrom
quelle