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 off
a 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.