Ich habe ein Perl- und Shell-Skript, das eine Menge Daten verarbeitet und die Ergebnisse ausgibt, sobald sie auftreten, wie:
5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!
usw.
Wenn ich die URL jedoch mit Chrome besuche, wird nichts angezeigt. Es wird gewartet, bis das Skript beendet ist, und dann diegesamteAusgabe auf einmal. Gibt es eine Möglichkeit, nginx so zu konfigurieren, dass jede Zeilenausgabe angezeigt wird, sobald sie erfolgt? Früher konnte ich das mit Apache machen.
Ich habe gzip off
die Nginx-Konfiguration eingefügt und dachte, Nginx könnte warten, bis der Text komprimiert ist, bevor er an den Client gesendet wird, aber das hat nicht geholfen.
Ich habe auch Techniken zum Leeren des Puffers in den Skripten selbst ausprobiert, wie diese Zeilen oben in meinen Perl-Skripten:
use IO::Handle;
$| ++;
STDERR->autoflush(1);
STDOUT->autoflush(1);
print "Content-type: text/plain\n\n";
Relevante Teile der nginx-Konfiguration sehen so aus
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;
}
Irgendwelche Ideen?
Antwort1
Sie müssen nginx sagen,die Antwort nicht puffernvom FastCGI-Server, mit fastcgi_buffering off;
.
Aus den Dokumenten:
Wenn die Pufferung deaktiviert ist, wird die Antwort synchron an einen Client weitergeleitet, unmittelbar nachdem sie empfangen wurde. nginx versucht nicht, die gesamte Antwort vom FastCGI-Server zu lesen. Die maximale Größe der Daten, die nginx gleichzeitig vom Server empfangen kann, wird durch diefastcgi_buffer_sizeRichtlinie.
Was Sie möglicherweise auch optimieren müssen.
Aber im Allgemeinen ist eine einfache HTML-Webseite wahrscheinlich nicht die beste Schnittstelle für das, was Sie tun.