Буферизация ответов от бэкендов.

Evgeny Turnaev turnaev.e на gmail.com
Чт Сен 8 09:48:38 UTC 2011


Доброго времени суток.
  Вопросы:
  1) Нам очень нужен режим небуферизованный режим работы с бэкендами.
(fast_cgi, uwsgi)
  т.е. если бэкенд прислал 1Кб данных и пошел отдыхать то nginx должен
отдавать chunk (если клиент поддерживает HTTP/1.1)

  1.1) Будет ли принят патч http://forum.nginx.org/read.php?29,213388
?  (отключение буферизации на uwsgi директивой uwsg_buffering)

  На данный момент с этим делом все не так просто.

Далее по тексту - если не указанно то версия nginx 1.1.1
root на nostromo:/usr/local/nginx_test/sbin# ./nginx -V
nginx: nginx version: nginx/1.1.1
nginx: built by gcc 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
nginx: TLS SNI support enabled
nginx: configure arguments: --with-debug --with-cc-opt='-D
NGX_UPSTREAM_KEEPALIVE_PATCHED' --prefix=/usr/local/nginx_test
--add-module=../ngx_http_upstream_keepalive-f3b50effc1d4/
--with-poll_module --with-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_xslt_module
--with-http_image_filter_module --with-http_geoip_module
--with-http_sub_module --with-http_dav_module --with-http_flv_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_degradation_module
--with-http_stub_status_module --with-http_perl_module
--without-http_memcached_module

Суть проблемы более детально:
Бэкенды на данный момент на fast_cgi (в дальнейшем планируется переход на uwsgi)
Казалось бы  для того чтобы nginx отдавал chunkи  по мере поступления
данных от бэкенда
логично было бы указать proxy_buffering off; в конфиге
но это не работает :( почему то nginx продолжает ожидать всего ответа
от бекенда.

Хочу заметить что нам НЕ нужен keepalive (бэкенд закрывает сокет после
ответа. по крайней мере uwsgi делает это точно.)

Более инересные вещи:
С keepalive патчем из этой ссылки
http://mailman.nginx.org/pipermail/nginx-devel/2011-July/001057.html
внезапно стал работать proxy_buffering off; на fast_cgi бэкенде. (с
отключенным gzip) (конфиг в аттаче см. ниже)
Что инетересно - стало работать даже без указания keepalive N; или
каких либо proxy_http_version.
(для того чтобы отключить буферизацию на uwsgi пришлось поставить патч
http://forum.nginx.org/read.php?29,213388 )
Однако если включить gzip фильтр - он (gzip фильтр) начинал
буферизовывать ответ.
Чтобы это исправить - пришлось сделать пару правок в
ngx_http_gzip_filter_module.c
(в аттаче архив с патчем, тестовыми клиентами и бэкендами и nginx на
котором я тестил)
вот ссылка на архив с патчем:
https://docs.google.com/leaf?id=0B3-C0q92L4ZIYmY2MmY2MGEtNWFkZS00YzU1LWE5NDUtMmE0NWNlNDBiMzIz&hl=ru

(1.1.1 ./configure --with-debug --with-cc-opt="-D
NGX_UPSTREAM_KEEPALIVE_PATCHED" --prefix=/usr/local/nginx_test
--add-module=../ngx_http_upstream_keepalive-f3b50effc1d4/
--with-poll_module --with-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_xslt_module
--with-http_image_filter_module  --with-http_geoip_module
--with-http_sub_module --with-http_dav_module  --with-http_flv_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_degradation_module
--with-http_stub_status_module --with-http_perl_module
--without-http_memcached_module )

патч добавил директиву z_sync on | off
с включенным z_sync - zlib сразу выбрасывает ответ и nginx тоже.

(в сорсе вроде есть postpone_gzipping который при значении 0 вроде как
должен отключать буферизацию. ctx->buffering по используется он только
в ngx_http_gzip_filter_buffer и не используется для ctx->flush хотя
можно было бы при 0 выставлять ctx->flush = 1 и не лепить отдельную
директиву z_sync)

Еще более интересные вещи:
на nginx-1.1.2 с вот этим патчем (keepalive full 5 ):
http://forum.nginx.org/read.php?21,214936,214937#msg-214937
nginx буферизует ответ от бэкенда с proxy_buffering off;  :(
Причем включение/выключение gzip не влияет.

( ./configure --with-debug --prefix=/usr/local/nginx_test1.2
--with-poll_module --with-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_xslt_module
--with-http_image_filter_module  --with-http_geoip_module
--with-http_sub_module --with-http_dav_module  --with-http_flv_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_degradation_module
--with-http_stub_status_module --with-http_perl_module
--without-http_memcached_module ) тот же конфиг что в архиве.

Резюме:
- Нам бы очень хотелось увидеть работающую proxy_buffering off; безо
всяких патчей и keepalive (на fast_cgi и uwsgi)
- Хотелось бы иметь возможность отключать буферизацию в gzip фильтре
совсем (Z_SYNC_FLUSH) из конфига nginx

-- 
--------------------------------------------
Турнаев Евгений Викторович
+7 906 875 09 43
--------------------------------------------
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: nginx_gzip_patch.tar.bz2
Type: application/x-bzip2
Size: 524779 bytes
Desc: отсутствует
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20110908/71102356/attachment-0001.bin>


Подробная информация о списке рассылки nginx-ru