Welcome! Log In Create A New Profile

Advanced

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

Evgeny Turnaev
September 08, 2011 05:50AM
Доброго времени суток.
Вопросы:
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
--------------------------------------------
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Attachments:
open | download - nginx_gzip_patch.tar.bz2 (512.5 KB)
Subject Author Posted

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

Evgeny Turnaev September 08, 2011 05:50AM

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

Maxim Dounin September 08, 2011 06:40AM

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

Evgeny Turnaev September 08, 2011 07:40AM

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

Maxim Dounin September 08, 2011 09:00AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 211
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready