Como habilitar saídas de linha CGI imediatas com Nginx, sem esperar a conclusão de um script CGI?

Como habilitar saídas de linha CGI imediatas com Nginx, sem esperar a conclusão de um script CGI?

Eu tenho um script perl e shell que processa vários dados e gera resultados conforme eles acontecem, como:

5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!

etc.

Porém, quando visito o URL com o Chrome, ele não mostra nada, espera até que o script termine e depois mostra ointeirosaída de uma vez. Existe uma maneira de configurar o nginx para mostrar cada saída de linha conforme isso acontece? Eu costumava fazer isso com o Apache.

Coloquei gzip offa configuração do nginx, pensando que isso poderia fazer com que o nginx esperasse compactar o texto antes de enviá-lo ao cliente, mas não adiantou.

Também tentei técnicas de limpeza de buffer nos próprios scripts, como estas linhas no topo dos meus scripts Perl:

use IO::Handle;
$| ++;
STDERR->autoflush(1);
STDOUT->autoflush(1);
print "Content-type: text/plain\n\n";

As partes relevantes da configuração do nginx são assim

  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;
  }

Alguma ideia?

Responder1

Você precisa dizer ao nginx paranão amortecer a respostado servidor FastCGI, com fastcgi_buffering off;.

Dos documentos:

Quando o buffer está desabilitado, a resposta é passada para um cliente de forma síncrona, assim que é recebida. O nginx não tentará ler toda a resposta do servidor FastCGI. O tamanho máximo dos dados que o nginx pode receber do servidor por vez é definido pelofastcgi_buffer_sizediretiva.

O que você também pode precisar ajustar.

Mas, em geral, uma página HTML simples provavelmente não é a melhor interface para o que quer que você esteja fazendo.

informação relacionada