Когда я запускаю cgi-скрипт под Apache, любой вывод быстро отправляется клиенту. Однако, когда я запускаю его под nginx с помощью fcgiwrap, кажется, что клиенту ничего не отправляется, пока сценарий не завершится или не выдаст большой объем вывода. В частности, при использовании git-http-backend это приводит к тайм-аутам шлюза при клонировании больших репозиториев (и отсутствию информации о ходе клонирования более мелких).
Это поведение можно увидеть в следующем сценарии.
#!/bin/bash
echo "Content-type: text/html"
echo
while :
do
echo this is a test.
sleep 5
done
Под apache клиент будет получать данные каждые 5 секунд.
Под nginx с fcgiwrap я не получаю данных и тайм-аут шлюза.
nginx и fcgiwrap - это пакеты от Debian Jessie. Версии 1.1.0-5 и 1.6.2-5 + deb8u4
Итак, вопросы
Хорошо, разобрался. Кажется, что и nginx, и fcgiwrap имеют нежелательную буферизацию. Для nginx кажется, что его можно отключить через конфигурацию, в то время как fcgiwrap нуждается в патче.
Я разместил debdiff для fcgiwrap по адресу http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863478 это добавляет новую опцию NO_BUFFERING
(обновление: Debian уже применил указанный патч, поэтому, если вы используете Debian Buster или более позднюю версию, вам не нужно применять его самостоятельно).
Затем необходимо изменить конфигурацию nginx, чтобы передать параметр NO_BUFFERING в fcgiwrap и отключить буферизацию внутри nginx.
Для этого я добавил некоторые настройки непосредственно перед и после "include fastcgi_params;" линия.
#note: NO_BUFFERING relies on a patched fcgiwrap.
fastcgi_param NO_BUFFERING 1;
include fastcgi_params;
gzip off;
fastcgi_buffering off;