Включение кодированной передачи nginx
Похоже, что 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, но мне посоветовали, что он больше подходит для сбоя сервера)
4 ответа
Это старый вопрос, я знаю, но он возник в поисках проблемы (которую я потратил во второй половине дня, пытаясь решить). Комментарий Мартина Ф. дал мне достаточно подсказки, чтобы заставить его работать!
Хитрость заключается в том, чтобы установить proxy_buffering off;
в вашем блоке местоположения. Предполагая, что ваш вышестоящий сервер отправляет обратно чанкованные ответы, это заставит nginx отправлять отдельные чанки обратно клиенту - даже распаковывать их на лету, если у вас включено сжатие вывода gzip.
Обратите внимание, что отключение буферизации может иметь и другие недостатки, поэтому не стоит слепо отключать буферизацию, не понимая почему.
Предлагаю отредактировать ваш вопрос для уточнения. Существует большая разница между частями запросов и частями ответов. Ответ Джона Далтона касается последнего. Git делает оба.
В настоящее время Nginx не поддерживает фрагментированные POST-запросы, и эта публикация показывается в результатах поиска по этой теме. Частичные POST-запросы используются, когда вы не знаете заранее объем загружаемых данных и часто используются мобильными телефонами.
Единственное рабочее решение, которое я нашел, это:
http://wiki.nginx.org/HttpChunkinModule
К сожалению, требуется перекомпиляция nginx, так как nginx не поддерживает загружаемые модули.
В моем случае... я пробую много вещей и, наконец, нужно только добавить в конфигурацию
proxy_http_version 1.1;
И это работает...
Другие ответы были действительны, но это старый вопрос.
Кажется, что Chunked Transfers поддерживаются в nginx 1.3.9[1], который был выпущен в середине 2013 года, я думаю.