การเปิดใช้งานการเข้ารหัสการถ่ายโอนข้อมูลแบบ nunkx


17

ดูเหมือนว่าnginx 0.8.35 อาจรองรับการเข้ารหัสการถ่ายโอนแบบต่อเนื่อง :

การเปลี่ยนแปลงด้วย nginx 0.8.35 01 เมษายน 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

นี่เป็นสิ่งที่ดีมากเพราะฉันพยายามผลักดันการเปลี่ยนแปลง git ผ่านพร็อกซีย้อนกลับ nginx ไปยังกระบวนการ git-http-backend Git HTTP จะได้ประโยชน์จากการเข้ารหัสขนส่งเป็นชิ้นส่วนสำหรับเหตุผลที่ฝั่งไคลเอ็นต์ประสิทธิภาพ

อย่างไรก็ตามฉันไม่สามารถใช้งานได้ ฉันใช้ nginx 0.8.44 กับ Debian Lenny ด้วยค่ากำหนดต่อไปนี้:

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

และไฟล์ conf ต่อไปนี้:

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

และproxy.confหน้าตาของฉันแบบนี้:

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;

(เดิมฉันโพสต์คำถามนี้เพื่อ Stack Overflowแต่แนะนำว่ามันเหมาะสมกับ Server Fault มากกว่า)


1
คุณไม่สามารถมีบัฟเฟอร์เช่นเดียวกับการเข้ารหัส chunked บัฟเฟอร์รอส่งข้อมูลชิ้นข้อมูลควรส่งทันที
Martin Fjordvald

เห็นได้ชัดว่า Nginx รองรับ Chunked ตั้งแต่รุ่น 1.3.9 (27/11/2012) อย่างไรก็ตามฉันยังคงได้รับข้อความข้อผิดพลาด "ต้องมีความยาว 411" เมื่อสมาร์ทโฟนส่งคำขอ POST แบบหนาไปยังเซิร์ฟเวอร์ Nginx ของฉัน คำแนะนำใด ๆ?
เมียร์

คำตอบ:


25

นี่เป็นคำถามเก่าฉันรู้ แต่มันเกิดขึ้นในการค้นหาปัญหา (ซึ่งฉันใช้เวลาช่วงบ่ายพยายามแก้ไข) ความคิดเห็นของ Martin F ทำให้ฉันมีเงื่อนงำเพียงพอที่จะทำให้มันทำงานได้!

เคล็ดลับคือการตั้งค่าproxy_buffering off;ในบล็อกสถานที่ของคุณ สมมติว่าเซิร์ฟเวอร์ upstream ของคุณกำลังส่งการตอบกลับแบบ chunked สิ่งนี้จะทำให้ nginx ส่ง chunks แต่ละรายการกลับไปยังไคลเอนต์ - แม้จะ gzipping พวกเขาทันทีหากคุณเปิดใช้การบีบอัดเอาต์พุต gzip

โปรดทราบว่าการปิดการบัฟเฟอร์อาจมีข้อเสียอื่น ๆ ดังนั้นอย่าปิดการบัฟเฟอร์โดยสุ่มโดยไม่เข้าใจว่าทำไม


9

ฉันขอแนะนำให้แก้ไขคำถามของคุณเพื่อชี้แจง มีความแตกต่างใหญ่ระหว่างคำร้องขอที่แยกเป็นชิ้นและคำตอบที่แยกกัน คำตอบของ John Dalton พูดถึงเรื่องหลัง Git ทำทั้งสองอย่าง

ขณะนี้ Nginx ไม่สนับสนุนคำขอ POST ที่มีการใช้งานจำนวนมากและการโพสต์นี้แสดงผลการค้นหาในหัวข้อสูง คำขอ POST แบบ Chunked จะใช้เมื่อคุณไม่ทราบจำนวนข้อมูลที่จะถูกอัปโหลดล่วงหน้าและมักใช้กับโทรศัพท์มือถือ

ทางออกเดียวที่ฉันพบคือ:

http://wiki.nginx.org/HttpChunkinModule

น่าเสียดายที่ต้องมีการคอมไพล์ใหม่ nginx เนื่องจาก nginx ไม่รองรับโมดูลที่โหลดได้


ฉันเห็นด้วย: ฉันพบว่า HttpChunkinModule เป็นวิธีแก้ปัญหาทางทฤษฎีเพียงอย่างเดียว ... แต่มันไม่เปิดให้ฉันในสถานการณ์ของฉัน ไม่มีใครรู้ว่ามีสิ่งอื่นที่สามารถทำได้? (การเปลี่ยนแปลงใด ๆ ตั้งแต่ 30 มกราคม 2011)
mdahlman

1
ไม่มีการเปลี่ยนแปลงที่ฉันรู้ ฉันเพิ่งจะคอมไพล์ nginx เมื่อวันก่อนเพื่อเปิดใช้งานสิ่งนี้
Roger Binns

2

ในกรณีของฉัน ... ฉันลองหลายสิ่งหลายอย่างและในที่สุดก็แค่ต้องการเพิ่มการกำหนดค่า

proxy_http_version 1.1;

และมันใช้งานได้ ...


ฉันต้องเพิ่มproxy_set_header Connection "";... คำตอบเดิมจาก -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich

สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน แต่ฉันไม่เข้าใจว่าทำไม
เจฟฟ์

อัปเดตเป็นความคิดเห็นล่าสุดของฉัน .... สิ่งนี้ทำงานได้เนื่องจากเซิร์ฟเวอร์อัปสตรีมของฉันใช้การเข้ารหัสการถ่ายโอนแบบ Chunked ซึ่งได้รับการแนะนำใน HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ) ค่าเริ่มต้นของโปรโตคอล http สำหรับ nginx proxying คือ 1.0
Jeff

1

คำตอบอื่น ๆ ที่ใช้ถูกต้อง แต่เป็นคำถามเก่า

ดูเหมือนว่าChunked Transfers จะได้รับการสนับสนุนต่อ nginx 1.3.9 [1] ซึ่งวางจำหน่ายกลางปี ​​2556 ฉันคิดว่า

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.