如何使用 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_buffer_size指示。

您可能還需要調整。

但一般來說,無論您正在做什麼,純 HTML 網頁可能都不是最佳介面。

相關內容