web-dev-qa-db-ja.com

Nginxとfcgiwrap、インクリメンタル出力の問題

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

だから質問

  1. 誰がこの行動の原因であるか知っていますか? nginx自体? fcgiwrap?両方?
  2. 設定で修正できるものですか?
  3. Fcgiwrapの問題である場合、問題が発生しない代替のcgiラッパーはありますか?
4
Peter Green

わかりました、それを理解しました。 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;
4
Peter Green