CGI 스크립트가 완료될 때까지 기다리지 않고 Nginx를 사용하여 즉시 CGI 라인 출력을 활성화하는 방법은 무엇입니까?

CGI 스크립트가 완료될 때까지 기다리지 않고 Nginx를 사용하여 즉시 CGI 라인 출력을 활성화하는 방법은 무엇입니까?

나는 다음과 같이 많은 데이터를 처리하고 결과를 출력하는 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 offnginx 구성을 넣었는데, 이것이 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 웹 페이지는 현재 수행 중인 작업에 가장 적합한 인터페이스가 아닐 수 있습니다.

관련 정보