我有一個 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 網頁可能都不是最佳介面。