CGI スクリプトの終了を待たずに、Nginx で即時の CGI ライン出力を有効にする方法

CGI スクリプトの終了を待たずに、Nginx で即時の CGI ライン出力を有効にする方法

次のような大量のデータを処理し、発生した結果を出力する Perl およびシェル スクリプトがあります。

5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!

しかし、ChromeでURLにアクセスすると何も表示されず、スクリプトが終了するまで待ってから全体出力を一度に表示します。各行の出力を発生するたびに表示するように nginx を設定する方法はありますか? 以前は Apache でこれを行うことができました。

gzip offnginx 構成に、クライアントに送信する前にテキストを圧縮するのを nginx が待機できると考えましたが、役に立ちませんでした。

また、Perl スクリプトの先頭にある次の行のように、スクリプト自体でバッファ フラッシュ手法も試しました。

use IO::Handle;
$| ++;
STDERR->autoflush(1);
STDOUT->autoflush(1);
print "Content-type: text/plain\n\n";

nginx設定の関連部分は次のようになります

  ssl on;
  root /my/path/cgi ;
  proxy_read_timeout 900s ;
  fastcgi_read_timeout 900s ;
  fastcgi_request_buffering off ;
  gzip off ;
  location ~ \.pl|cgi$ {
    try_files $uri =404;
    gzip off;
    fastcgi_pass  unix:/var/run/fcgiwrap.socket;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  }

何か案は?

答え1

nginxに指示する必要があります応答をバッファリングしないFastCGI サーバーから、fastcgi_buffering off;.

ドキュメントより:

バッファリングが無効になっている場合、応答は受信されるとすぐに同期的にクライアントに渡されます。nginxはFastCGIサーバーからの応答全体を読み取ろうとはしません。nginxがサーバーから一度に受信できるデータの最大サイズは、バッファサイズ指令。

これも微調整する必要があるかもしれません。

しかし、一般的に、プレーンな HTML Web ページは、何をするにしても最適なインターフェースではない可能性があります。

関連情報