我有一个 perl 和 shell 脚本,可以处理大量数据并在发生时输出结果,例如:
5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!
ETC。
但是,当我使用 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 一次可以从服务器接收的最大数据大小由fastcgi_buffersize_size指示。
您可能还需要进行调整。
但一般来说,无论您在做什么,纯 HTML 网页可能都不是最佳界面。