나는 다음과 같이 많은 데이터를 처리하고 결과를 출력하는 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가 서버로부터 동시에 수신할 수 있는 데이터의 최대 크기는 다음과 같이 설정됩니다.fastcgi_buffer_size지령.
조정해야 할 수도 있습니다.
그러나 일반적으로 일반 HTML 웹 페이지는 현재 수행 중인 작업에 가장 적합한 인터페이스가 아닐 수 있습니다.