Kích hoạt mã hóa chuyển khoản nginx


17

Có vẻ như nginx 0.8,35 có thể hỗ trợ mã hóa chuyển giao chunked :

Thay đổi với nginx 0.8,35 ngày 01 tháng 4 năm 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Điều này thật tuyệt vời, bởi vì tôi đang cố gắng để thay đổi git đẩy thông qua proxy ngược nginx thành quy trình phụ trợ git-http-bac. Git HTTP tận dụng lợi thế của mã hóa chuyển giao chunked vì lý do hiệu quả phía khách hàng .

Tuy nhiên, tôi không thể làm cho nó hoạt động. Tôi đang sử dụng nginx 0.8.44 trên Debian Lenny với lệnh gọi cấu hình sau:

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

Và tập tin conf sau:

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

Và tôi proxy.conftrông như thế này:

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;

(Ban đầu tôi đã đăng câu hỏi này lên Stack Overflow nhưng được khuyên là nó phù hợp hơn với Server Fault)


1
Bạn không thể có bộ đệm cũng như mã hóa chunked. Bộ đệm chờ để gửi dữ liệu, chunk nên gửi nó ngay lập tức.
Martin Fjordvald

Rõ ràng Nginx hỗ trợ Chunked kể từ phiên bản 1.3.9 (27/11/2012). Tuy nhiên, tôi vẫn nhận được thông báo lỗi "Yêu cầu độ dài 411" khi điện thoại thông minh gửi các yêu cầu POST được gửi đến máy chủ Nginx của tôi. Có lời khuyên nào không?
Meir

Câu trả lời:


25

Đây là một câu hỏi cũ, tôi biết, nhưng nó đã xuất hiện trong một cuộc tìm kiếm vấn đề (mà tôi đã dành cả buổi chiều để cố gắng giải quyết). Nhận xét của Martin F đã cho tôi đủ manh mối để khiến nó hoạt động!

Bí quyết là đặt proxy_buffering off;trong khối vị trí của bạn. Giả sử rằng máy chủ ngược dòng của bạn đang gửi lại phản hồi chunked, điều này sẽ khiến nginx gửi các khối riêng lẻ trở lại máy khách - thậm chí gzipping chúng khi bạn bật tính năng nén đầu ra gzip.

Lưu ý rằng tắt bộ đệm có thể có những nhược điểm khác, vì vậy đừng mù quáng tắt bộ đệm mà không hiểu lý do tại sao.


9

Tôi đề nghị chỉnh sửa câu hỏi của bạn để làm rõ. Có một sự khác biệt lớn giữa các yêu cầu chunked và phản hồi chunked. Câu trả lời của John Dalton giải quyết sau. Git làm cả hai.

Nginx hiện không hỗ trợ các yêu cầu POST chunk và bài đăng này hiển thị cao trong kết quả tìm kiếm về chủ đề này. Yêu cầu POST chunked được sử dụng khi bạn không biết trước lượng dữ liệu được tải lên và thường được sử dụng bởi điện thoại di động.

Giải pháp làm việc duy nhất tôi tìm thấy là:

http://wiki.nginx.org/HttpChunkinModule

Thật không may, nó yêu cầu biên dịch lại nginx vì nginx không hỗ trợ các mô-đun có thể tải.


Tôi đồng ý: Tôi thấy rằng HttpChunkinModule là giải pháp lý thuyết duy nhất ... nhưng nó không mở ra cho tôi trong tình huống của tôi. Có ai biết nếu có thể làm bất cứ điều gì khác? (Có thay đổi nào kể từ ngày 30 tháng 1 năm 2011 không?)
mdahlman

1
Không có thay đổi mà tôi biết. Tôi vừa mới biên dịch lại nginx vào một ngày khác để kích hoạt tính năng này.
Roger Binns

2

Trong trường hợp của tôi ... tôi đã thử rất nhiều thứ và cuối cùng chỉ cần thêm vào cấu hình

proxy_http_version 1.1;

Và nó hoạt động...


Tôi đã phải thêm proxy_set_header Connection "";... câu trả lời gốc từ -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich

Cái này cũng có tác dụng với tôi. Nhưng tôi thực sự không hiểu tại sao.
Jeff

Cập nhật nhận xét cuối cùng của tôi .... điều này đã hoạt động vì máy chủ ngược dòng của tôi đang sử dụng Mã hóa chuyển giao Chunked, được giới thiệu trong HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). Phiên bản giao thức http mặc định cho proxy nginx là 1.0.
Jeff

1

Các câu trả lời khác được sử dụng là hợp lệ, nhưng đây là một câu hỏi cũ.

Có vẻ như Chunked Trans Transfer được hỗ trợ cho mỗi nginx 1.3.9 [1], được phát hành vào giữa năm 2013 tôi nghĩ.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.