Как включить немедленный вывод строк CGI с помощью Nginx, не дожидаясь завершения скрипта CGI?

Как включить немедленный вывод строк CGI с помощью Nginx, не дожидаясь завершения скрипта CGI?

У меня есть скрипт на Perl и Shell, который обрабатывает набор данных и выводит результаты по мере их поступления, например:

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

Есть идеи?

решение1

Вам нужно указать nginxне буферизовать ответс сервера FastCGI, с fastcgi_buffering off;.

Из документов:

Если буферизация отключена, ответ передается клиенту синхронно, сразу по мере получения. nginx не будет пытаться прочитать весь ответ с сервера FastCGI. Максимальный размер данных, которые nginx может получить от сервера за один раз, задается параметромfastcgi_buffer_sizeдиректива.

Которые вам, возможно, также придется подправить.

Но в целом простая HTML-страница, вероятно, не лучший интерфейс для того, что вы делаете.

Связанный контент