Tengo un script de Perl y Shell que procesa una gran cantidad de datos y genera resultados a medida que ocurren, como:
5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!
etc.
Sin embargo, cuando visito la URL con Chrome, no muestra nada, espera hasta que finaliza el script y luego muestra elcompletosalida a la vez. ¿Hay alguna manera de configurar nginx para mostrar la salida de cada línea a medida que sucede? Solía poder hacer esto con Apache.
Puse gzip off
la configuración de nginx, pensando que esto podría nginx esperando para comprimir el texto antes de enviarlo al cliente, pero eso no ayudó.
También probé técnicas de limpieza del búfer en los propios scripts, como estas líneas en la parte superior de mis scripts de Perl:
use IO::Handle;
$| ++;
STDERR->autoflush(1);
STDOUT->autoflush(1);
print "Content-type: text/plain\n\n";
Las partes relevantes de la configuración de nginx se ven así
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;
}
¿Algunas ideas?
Respuesta1
Necesitas decirle a nginx queno amortiguar la respuestadesde el servidor FastCGI, con fastcgi_buffering off;
.
De los documentos:
Cuando el almacenamiento en búfer está deshabilitado, la respuesta se pasa a un cliente de forma sincrónica, inmediatamente después de recibirla. nginx no intentará leer la respuesta completa del servidor FastCGI. El tamaño máximo de los datos que nginx puede recibir del servidor a la vez lo establece elfastcgi_buffer_sizedirectiva.
Que quizás también necesites modificar.
Pero, en general, una página web HTML simple probablemente no sea la mejor interfaz para lo que sea que estés haciendo.