У меня есть сценарий perl и оболочки, который обрабатывает кучу данных и выводит результаты по мере их появления, например:
5 processed in 0.58 seconds.
10 processed in 0.79 seconds.
...
150 processed in 0.65 seconds. DONE!
и т.п.
Однако, когда я посещаю URL-адрес с помощью Chrome, он ничего не показывает, ждет завершения скрипта, а затем показывает весь вывод сразу. Есть ли способ настроить nginx для отображения каждой строки, как это происходит? Раньше я мог делать это с помощью Apache.
я кладу gzip off
в конфигурации nginx, думая, что это может 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;
}
Любые идеи?
Вам нужно сообщить nginx не буферизировать ответ с сервера FastCGI, с fastcgi_buffering off;
.
Из документов:
Когда буферизация отключена, ответ передается клиенту синхронно, сразу после его получения. nginx не будет пытаться прочитать весь ответ от сервера FastCGI. Максимальный размер данных, которые nginx может получать от сервера за раз, устанавливается fastcgi_buffer_size директива.
Что вам также может потребоваться настроить.
Но в целом обычная веб-страница HTML, вероятно, не лучший интерфейс для того, что вы делаете.