Skip to content

Потоковая отправка ответа и Nginx

06/04/2010

При ответе на этот вопрос на StackOverflow я на скорую руку сделал скрипт, отдающий ответ браузеру по частям — одну строку в секунду. Потом я соединялся с сервером через Putty, и смотрел как на самом деле отдаётся ответ.

Вот сам скрипт:

    var sys = require('sys'),
    http = require('http');
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        var currentTime = new Date();
        sys.puts('Starting sending time');
        setInterval(function(){
            res.write(
                currentTime.getHours()
                + ':' +
                currentTime.getMinutes()
                + ':' +
                currentTime.getSeconds() + "\n"
            );

            setTimeout(function() {
                res.close();
            }, 10000);

        },1000);
    }).listen(8000);
  

При этой простой проверке выяснилась интересная вещь.

Обычно все запросы к Node у меня проходят через Nginx. Это сделано в основном для удобства отдачи файлов (они просто складываются в отдельную директорию, которая доступна по адресу /files). И вот при тестировании частичной отдачи контента я заметил, что Node сама по себе отдаёт ответ по мере использования response.write(), но при обращении через Nginx ответ собирается в какой то буфер и отдаётся потом целиком. Это иногда не очень хорошо (например, мы в потоковом режиме обрабатываем и отдаём через Node какой нибудь огромный файл). Я решил разобраться в чём дело.

А оказалось всё довольно просто. Nginx действительно по умолчанию использует буфер для ответа. Чтобы его выключить, надо добавить в nginx.conf следующую строку (туда же, где прописан proxy_pass для Node):

proxy_buffering off;

После этого Nginx будет отдавать данные сразу, не пытаясь сохранить в память весь ответ.

Advertisements
Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: