У меня есть скрипт на 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-страница, вероятно, не лучший интерфейс для того, что вы делаете.