Apacheでcgiスクリプトを実行すると、出力がクライアントにすばやく送信されます。ただし、fcgiwrapを使用してnginxで実行すると、スクリプトが終了するか、大量の出力が生成されるまで、クライアントに何も送信されないようです。特にgit-http-backendを使用する場合、これにより、大きなリポジトリのクローン作成時にゲートウェイのタイムアウトが発生します(また、小さなリポジトリのクローン作成に関する進捗情報が不足します)。
この動作は、次のスクリプトで確認できます。
#!/bin/bash
echo "Content-type: text/html"
echo
while :
do
echo this is a test.
sleep 5
done
Apacheでは、クライアントは5秒ごとにデータを取得します。
Fcgiwrapを使用したnginxでは、データがなく、ゲートウェイのタイムアウトが発生します。
nginxとfcgiwrapは、DebianJessieのパッケージです。バージョン1.1.0-5および1.6.2-5 + deb8u4
だから質問
わかりました、それを理解しました。 nginxとfcgiwrapの両方に望ましくないバッファリングが設定されているようです。 nginxの場合、fcgiwrapにパッチが必要な間は、構成によって無効にできるようです。
Fcgiwrapのdebdiffを http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863478 に投稿しました。これにより新しいオプションNO_BUFFERINGが追加されます。
(更新:Debianは上記のパッチを適用しているため、Debian Buster以降を実行している場合は、自分で適用する必要はありません)。
次に、nginx構成を変更して、NO_BUFFERINGオプションをfcgiwrapに渡し、nginx内のバッファリングを無効にする必要があります。
これを行うために、「includefastcgi_params;」の直前と直後にいくつかの設定を追加しました。ライン。
#note: NO_BUFFERING relies on a patched fcgiwrap.
fastcgi_param NO_BUFFERING 1;
include fastcgi_params;
gzip off;
fastcgi_buffering off;