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

Maxim Dounin mdounin на mdounin.ru
Чт Сен 8 10:38:12 UTC 2011


Hello!

On Thu, Sep 08, 2011 at 01:48:38PM +0400, Evgeny Turnaev wrote:

> Доброго времени суток.
>   Вопросы:
>   1) Нам очень нужен режим небуферизованный режим работы с бэкендами.
> (fast_cgi, uwsgi)
>   т.е. если бэкенд прислал 1Кб данных и пошел отдыхать то nginx должен
> отдавать chunk (если клиент поддерживает HTTP/1.1)
> 
>   1.1) Будет ли принят патч http://forum.nginx.org/read.php?29,213388
> ?  (отключение буферизации на uwsgi директивой uwsg_buffering)

Вероятно да, но скорее всего не прямо сейчас.

[...]

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

proxy_buffering - это директива, включающая небуферизированный 
режим работы для proxy, к fastcgi она не имеет отношения.

Директивы fastcgi_buffering нет, т.к. небуферизированный режим 
работы для fastcgi не поддерживается.

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

Это логично: в протоколе 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 фильтр) начинал
> буферизовывать ответ.

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

В частности, на отправляемых буферах не ставится флаг flush, и 
если nginx сочтёт необходимым буферизировать данные в каком-либо 
другом месте - он будет это делать.  И gzip_filter - далеко не 
единственное подобное место.

Вообще, это скорее недоработка, чем на самом деле желаемое 
поведение.

И, повторюсь, директива proxy_buffering не имеет к модуля fastcgi 
никакого отношения.

[...]

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

postpone_gzipping - это совсем другая оптимизация: позволяет не 
вызывать лишний раз zlib, если данных пока мало, экономя таким 
образом процессор.

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

В письме, сопровождающем патч, лежит описание изменений.  Цитирую:

: FastCGI keepalive support now requires "fastcgi_keep_conn on;" in config. 
: Without the directive previous behaviour is preserved to make patches less 
: intrusive.

Если вы хотите получить поведение, соответствующее работе 
предыдущих версий патча, надо сказать "fastcgi_keep_conn on;" в 
конфиге.

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

Судя по вышеизложенному, на самом деле вам хотелось бы поддержку 
"fastcgi_buffering off;".  Её сейчас нет.

Maxim Dounin



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