Назад | Перейти на главную страницу

Nginx и fcgiwrap, проблемы с инкрементным выводом

Когда я запускаю 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

Итак, вопросы

  1. Кто-нибудь знает, что отвечает за такое поведение? сам nginx? fcgiwrap? обе?
  2. Это можно исправить с помощью конфигурации?
  3. Если это проблема fcgiwrap, есть ли альтернативные оболочки cgi, которые не страдают этой проблемой?

Хорошо, разобрался. Кажется, что и 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;