Назад | Перейти на главную страницу

Включение кодирования фрагментов передачи в nginx

Это выглядит как nginx 0.8.35 может поддерживать фрагментированное кодирование передачи:

Изменения в nginx 0.8.35 01.04.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;

(Первоначально я опубликовал это вопрос к переполнению стека но посоветовали это больше подходит для сбоя сервера)

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

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

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

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

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

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

http://wiki.nginx.org/HttpChunkinModule

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

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

proxy_http_version 1.1;

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

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

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

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