如何使用 Nginx 启用即时 CGI 行输出,而无需等待 CGI 脚本完成?

如何使用 Nginx 启用即时 CGI 行输出,而无需等待 CGI 脚本完成?

我有一个 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 网页可能都不是最佳界面。

相关内容