Re: Отключение буферизации для fastcgi

Maxim Dounin mdounin на mdounin.ru
Сб Мар 13 05:12:55 MSK 2010


Hello!

On Sat, Mar 13, 2010 at 03:29:36AM +0300, Dmitry Koterov wrote:

> Есть вот такая конфигурация:
> 
>     location ~ /action/ {
>         gzip off;
>         fastcgi_buffer_size 4k;
>         fastcgi_busy_buffers_size 4k;
>         fastcgi_buffers 2 4k;
>         fastcgi_pass   127.0.0.1:9000;
>         fastcgi_param  SCRIPT_FILENAME $document_root/index.php;
>         include fastcgi_params;
>     }
> 
> Вопрос: можно ли ВООБЩЕ ВЫКЛЮЧИТЬ буферизацию, а НЕ сделать ее равной 4k +
> 2*4k? Дело в том, что в index.php лежит:

Нет, вообще отключить буферизацию для fastcgi нельзя.

> 
> // в php.ini отключены output_buffering, output_compression, output_handler;
> implicit_flush включен
> while (ob_get_level()) ob_end_clean(); // на всякий пожарный
> for ($i = 0; $i < 5; $i++) {
>     echo "Test! " . time() . "<br>\n";
>     for ($n = 0; $n < 15000; $n++) echo "\n";
>     flush();
>     sleep(2);
> }
> exit;
> 
> И экспериментальным путем было установлено, что $n = 15000 (плюс-минус) -
> это минимальный размер "вантуза", которым удается "протолкнуть" контент в
> браузер. Установка fastcgi_buffer_size и fastcgi_busy_buffers_size в меньшие
> значения не помогают (возможно, они просто вообще не могут корректно
> определяться внутри location, либо же всегда кратны 4K?).
> 
> Т.е. задача - минимизировать размер "вантуза" любыми средствами. (Все-таки
> 15К - это многовато.)
> Подскажите, пожалуйста, как это правильно сделать.

nginx отдаёт данные клиенту (точнее - в цепочку исходящих 
фильтров) после заполнения бекендом очередного буфера (либо 
основного - fastcgi_buffer_size, либо одного из дополнительных - 
fastcgi_buffers).  В вашем случае это всегда 4k.  Можно уменьшить, 
но если в основной буфер не влезут все заголовки ответа - будет 
502.

А 16k - скорее всего следует искать либо в php, либо в других 
буферизирующих прослойках (e.g. ssl в nginx'е имеет буфер в 16k; 
если тестируем по ssl - то результат объясним).  Включённый debug 
log вкупе с тестиком вида "напечатать 1k и поспать секунду, 
повторить" быстро покажет что на самом деле происходит.

Maxim Dounin



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