次のような大量のデータを処理し、発生した結果を出力する 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 off
nginx 構成に、クライアントに送信する前にテキストを圧縮するのを 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 ページは、何をするにしても最適なインターフェースではない可能性があります。