Включение кодированной передачи nginx

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.

Это замечательно, потому что я пытаюсь передать push git изменения через обратный прокси-сервер nginx в процесс git-http-backend. Git HTTP использует преимущества кодирования передачи по частям для повышения эффективности на стороне клиента .

Тем не менее, я не могу заставить его работать. Я использую nginx 0.8.44 в Debian Lenny со следующим вызовом 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

И следующий файл 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, но мне посоветовали, что он больше подходит для сбоя сервера)

rentzsch
источник
1
Вы не можете иметь как буферы, так и чанкованное кодирование. Буферы ждут отправки данных, chunked должен отправить их немедленно.
Мартин Фьордвальд,
Судя по всему, Nginx поддерживает Chunked начиная с версии 1.3.9 (27/11/2012). Тем не менее, я все еще получаю сообщения об ошибке «Требуется длина 411», когда смартфон отправляет фрагментированные запросы POST на мой сервер Nginx. Любой совет?
Меир

Ответы:

25

Это старый вопрос, я знаю, но он возник в поисках проблемы (которую я провел днем, пытаясь решить). Комментарий Мартина Ф. дал мне достаточно подсказки, чтобы заставить его работать!

Хитрость заключается в том, чтобы установить proxy_buffering off;в вашем блоке местоположения. Предполагая, что ваш вышестоящий сервер отправляет обратно чанкованные ответы, это заставит nginx отправлять отдельные чанки обратно клиенту - даже распаковывать их на лету, если у вас включено сжатие вывода gzip.

Обратите внимание, что отключение буферизации может иметь другие недостатки, поэтому не стоит слепо отключать буферизацию, не понимая, почему.

Джон Далтон
источник
9

Предлагаю отредактировать ваш вопрос для уточнения. Существует большая разница между частями запросов и частями ответов. Ответ Джона Далтона касается последнего. Git делает оба.

Nginx в настоящее время не поддерживает фрагментированные POST-запросы, и эта публикация показывается в результатах поиска по этой теме Частичные POST-запросы используются, когда вы не знаете заранее объем загружаемых данных и часто используются мобильными телефонами.

Единственное рабочее решение, которое я нашел, это:

http://wiki.nginx.org/HttpChunkinModule

К сожалению, требуется перекомпиляция nginx, поскольку nginx не поддерживает загружаемые модули.

Роджер Биннс
источник
Я согласен: я считаю, что HttpChunkinModule - единственный теоретический обходной путь ... но он не открыт для меня в моей ситуации. Кто-нибудь знает, что еще можно сделать? (Какие-либо изменения с 30 января 2011 года?)
mdahlman
1
Никаких изменений, которые я знаю. Я только что сделал перекомпиляцию nginx на днях, чтобы включить это.
Роджер Биннс
2

В моем случае ... я пробую много вещей и, наконец, нужно только добавить в конфигурацию

proxy_http_version 1.1;

И это работает ...

Сезар Гальего
источник
Я должен был добавить proxy_set_header Connection "";... оригинальный ответ от -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Кристиан Ульбрих
Это сработало и для меня. Но я действительно не понимаю, почему.
Джефф
Обновление до моего последнего комментария .... это работало, потому что мой вышестоящий сервер использовал Chunked Transfer Encoding, который был представлен в HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). Версия протокола HTTP по умолчанию для проксирования nginx - 1.0.
Джефф
1

Другие ответы были действительны, но это старый вопрос.

Кажется, что Chunked Transfers поддерживаются в nginx 1.3.9 [1], который был выпущен в середине 2013 года, я думаю.

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

Сандстр
источник