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

Evgeny Turnaev turnaev.e на gmail.com
Чт Сен 8 11:39:20 UTC 2011


8 сентября 2011 г. 14:38 пользователь Maxim Dounin <mdounin на mdounin.ru> написал:
> 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 она не имеет отношения.
>

да действительно proxy_buffering не влиляет. т.е. дело в keepalive патче.

> Директивы 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; работает в таком же режиме как и 1.1.1

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

Можно ли ожидать fastcgi_buffering off; в ближайших версиях nginx?
(если смотреть по http://forum.nginx.org/read.php?29,213388 (который
был написан как переделка модуля fast_cgi) то
изменения минимальны.. пара строк + директива для конфига)

> Maxim Dounin
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>



-- 
--------------------------------------------
Турнаев Евгений Викторович
+7 906 875 09 43
--------------------------------------------


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