Увімкнення кодування переносу даних з 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.

Це чудово, тому що я намагаюся отримати зміни git зміни через зворотний проксі-файл nginx до процесу git-http-backkend. 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

І наступний конф-файл:

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, але мені було повідомлено, що воно більше відповідає вини сервера)


1
Ви не можете мати як буфери, так і кодовані. Буфери очікують надсилання даних, члени повинні надсилати їх негайно.
Мартін Фьордвальд

Мабуть, Nginx підтримує Chunked з версії 1.3.9 (27/11/2012). Однак я все одно отримую повідомлення про помилки "411 Необхідна довжина", коли смартфон надсилає зв'язані POST-запити на мій сервер Nginx. Будь-яка порада?
Меїр

Відповіді:


25

Я знаю, це старе питання, але воно з'явилося в пошуку проблеми (яку я провів після обіду, намагаючись вирішити). Коментар Мартіна F дав мені достатньо підказки, щоб змусити його працювати!

Трюк - встановити proxy_buffering off;у своєму блоці розташування. Якщо припустити, що ваш сервер вище за течією надсилає зворотні відповіді, це призведе до того, що nginx буде надсилати окремі шматочки назад клієнту - навіть gzipping їх на льоту, якщо у вас увімкнено стиснення вихідного сигналу gzip.

Зауважте, що відключення буферизації може мати інші недоліки, тому не слід сліпо вимикати буферизацію, не розуміючи, чому.


9

Я пропоную відредагувати ваше питання для уточнення. Існує велика різниця між чіткими запитами та чудовими відповідями. Відповідь Джона Далтона стосується останнього. Гіт робить і те, і інше.

Наразі 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
Christian Ulbrich

Це працювало і для мене. Але я дійсно не розумію, чому.
Джефф

Оновлення до мого останнього коментаря .... це спрацювало через те, що мій сервер вище за течією використовував кодований перенос Chunked Transfer, який було введено в HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). За замовчуванням версія протоколу http для nginx-проксі - 1,0.
Джефф

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.