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