Mengaktifkan Penyandian Transfer nginx Chunked

17

Sepertinya nginx 0.8.35 dapat mendukung penyandian transfer yang terpotong :

Perubahan dengan nginx 0.8.35 01 Apr 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Ini bagus, karena saya mencoba untuk mendapatkan perubahan push git melalui proksi reverse nginx ke proses git-http-backend. Git HTTP mengambil keuntungan dari pengkodean transfer chunked untuk alasan efisiensi sisi klien .

Namun, saya tidak bisa membuatnya bekerja. Saya menggunakan nginx 0.8.44 di Debian Lenny dengan permintaan konfigurasikan berikut:

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

Dan file conf berikut:

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

Dan proxy.confpenampilan saya seperti ini:

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;

(Awalnya saya memposting pertanyaan ini ke Stack Overflow tetapi disarankan lebih tepat untuk Kesalahan Server)

rentzsch
sumber
1
Anda tidak dapat memiliki buffer serta penyandian chunked. Buffer menunggu untuk mengirim data, chunked harus segera mengirimnya.
Martin Fjordvald
Rupanya Nginx mendukung Chunked sejak versi 1.3.9 (27/11/2012). Namun, saya masih mendapatkan pesan kesalahan "411 Wajib Diperlukan" ketika smartphone mengirim permintaan POST yang dipotong ke server Nginx saya. Ada saran?
Meir

Jawaban:

25

Ini adalah pertanyaan lama, saya tahu, tetapi muncul untuk mencari masalah (yang saya habiskan pada sore hari untuk menyelesaikannya). Komentar Martin F memberi saya cukup petunjuk untuk membuatnya bekerja!

Caranya adalah dengan mengatur proxy_buffering off;di blok lokasi Anda. Dengan anggapan bahwa server hulu Anda mengirim kembali respons yang terpotong, ini akan menyebabkan nginx mengirim potongan individual kembali ke klien - bahkan melakukan gzip dengan cepat jika Anda mengaktifkan kompresi gzip output.

Perhatikan bahwa mematikan buffering mungkin memiliki kelemahan lain, jadi jangan membabi buta mematikan buffering tanpa memahami alasannya.

John Dalton
sumber
9

Saya sarankan mengedit pertanyaan Anda untuk menjelaskan. Ada perbedaan besar antara permintaan chunk dan respons chunk. Jawaban John Dalton membahas yang terakhir. Git melakukan keduanya.

Nginx saat ini tidak mendukung permintaan POST chunked dan posting ini muncul tinggi dalam hasil pencarian pada topik. Permintaan POST chunked digunakan ketika Anda tidak tahu jumlah data yang diunggah sebelumnya dan sering digunakan oleh ponsel.

Satu-satunya solusi yang saya temukan adalah ini:

http://wiki.nginx.org/HttpChunkinModule

Sayangnya itu membutuhkan kompilasi ulang nginx karena nginx tidak mendukung modul yang dapat dimuat.

Roger Binns
sumber
Saya setuju: Saya menemukan bahwa HttpChunkinModule adalah satu-satunya solusi teoretis ... tetapi tidak terbuka untuk saya dalam situasi saya. Adakah yang tahu kalau hal lain bisa dilakukan? (
Adakah
1
Tidak ada perubahan yang saya tahu. Saya baru saja melakukan kompilasi ulang nginx tempo hari untuk mengaktifkan ini.
Roger Binns
2

Dalam kasus saya ... saya mencoba banyak hal dan akhirnya hanya perlu menambah konfigurasi

proxy_http_version 1.1;

Dan itu berhasil ...

Cesar Gallego
sumber
Saya harus menambahkan proxy_set_header Connection "";... jawaban asli dari -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
Ini juga bekerja untuk saya. Tetapi saya benar-benar tidak mengerti mengapa.
Jeff
Pembaruan untuk komentar terakhir saya .... ini berfungsi karena server hulu saya menggunakan Chunked Transfer Encoding, yang diperkenalkan di HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). Versi protokol http default untuk proksi nginx adalah 1.0.
Jeff
1

Jawaban lain dulu valid, tetapi ini adalah pertanyaan lama.

Sepertinya Chunked Transfer didukung per nginx 1.3.9 [1], yang dirilis pertengahan 2013 saya pikir.

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

sandstrom
sumber