Włączanie kodowania transferu częściowego nginx

17

Wygląda na to, że nginx 0.8.35 może obsługiwać kodowanie transferu fragmentarycznego :

Zmiany w stosunku do Nginx 0.8.35 01.04.2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Jest to świetne, ponieważ próbuję uzyskać zmiany push git poprzez zwrotny serwer proxy nginx do procesu zaplecza git-http. Git HTTP wykorzystuje kodowanie transferu fragmentarycznego ze względu na wydajność po stronie klienta .

Nie mogę go jednak uruchomić. Używam nginx 0.8.44 na Debian Lenny z następującą inwokacją konfiguracji:

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

I następujący plik conf:

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

A moje proxy.confwygląda tak:

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;

(Pierwotnie wysłałem to pytanie do Przepełnienia stosu, ale poradzono mi, że jest bardziej odpowiednie dla błędu serwera)

rentzsch
źródło
1
Nie możesz mieć zarówno buforów, jak i fragmentów. Bufory czekają na przesłanie danych, porcja powinna je natychmiast wysłać.
Martin Fjordvald
Najwyraźniej Nginx obsługuje Chunked od wersji 1.3.9 (27.11.2012). Jednak nadal pojawia się komunikat o błędzie „Wymagana długość 411”, gdy smartfon wysyła podzielone żądania POST na mój serwer Nginx. Jakakolwiek rada?
Meir

Odpowiedzi:

25

To stare pytanie, wiem, ale pojawiło się w poszukiwaniu problemu (który spędziłem popołudniu próbując rozwiązać). Komentarz Martina F. dał mi wystarczającą wskazówkę, aby go uruchomić!

Sztuką jest ustawienie proxy_buffering off;w swoim bloku lokalizacji. Zakładając, że twój serwer nadrzędny wysyła odpowiedzi fragmentaryczne, spowoduje to, że nginx odeśle poszczególne fragmenty z powrotem do klienta - nawet zgzipując je w locie, jeśli masz włączoną kompresję wyjściową gzip.

Pamiętaj, że wyłączenie buforowania może mieć inne wady, więc nie przechodź na ślepo, wyłączając buforowanie bez zrozumienia przyczyny.

John Dalton
źródło
9

Sugeruję edycję pytania w celu wyjaśnienia. Istnieje duża różnica między podzielonymi na części żądaniami i podzielonymi odpowiedziami. Odpowiedź Johna Daltona dotyczy tego drugiego. Git robi obie rzeczy.

Nginx obecnie nie obsługuje fragmentarycznych żądań POST, a ten post pojawia się wysoko w wynikach wyszukiwania na ten temat. Chunked POST są używane, gdy nie wiesz, ile danych jest przesyłanych z góry i często są używane przez telefony komórkowe.

Jedyne działające rozwiązanie, które znalazłem, to:

http://wiki.nginx.org/HttpChunkinModule

Niestety wymaga ponownej kompilacji nginx, ponieważ nginx nie obsługuje ładowalnych modułów.

Roger Binns
źródło
Zgadzam się: stwierdzam, że HttpChunkinModule jest jedynym teoretycznym obejściem ... ale w mojej sytuacji nie jest ono otwarte. Czy ktoś wie, czy można coś jeszcze zrobić? (Wszelkie zmiany od 30 stycznia 2011 r.?)
mdahlman,
1
Żadnych zmian, które znam. Właśnie zrobiłem rekompilację nginx pewnego dnia, aby to umożliwić.
Roger Binns,
2

W moim przypadku ... próbuję wielu rzeczy i wreszcie potrzebuję tylko dodać do konfiguracji

proxy_http_version 1.1;

I to działa ...

Cesar Gallego
źródło
Musiałem dodać proxy_set_header Connection "";... oryginalną odpowiedź z -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
To również działało dla mnie. Ale tak naprawdę nie rozumiem dlaczego.
Jeff
Aktualizacja do mojego ostatniego komentarza .... zadziałało, ponieważ mój serwer nadrzędny korzystał z kodowania transferu fragmentarycznego, które zostało wprowadzone w HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). Domyślna wersja protokołu HTTP dla proxy Nginx to 1.0.
Jeff
1

Inne odpowiedzi były prawidłowe, ale to stare pytanie.

Wygląda na to, że Chunked Transfers są obsługiwane per nginx 1.3.9 [1], który wydaje się być wydany w połowie 2013 roku.

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

sandstrom
źródło