Назад | Перейти на главную страницу

ответ восходящего потока буферизируется во временный файл

У меня есть довольно большое и медленное (сложные данные, сложный интерфейс) веб-приложение, встроенное в RoR и обслуживается Puma с участием nginx как обратный прокси. Глядя на nginx журнал ошибок, я вижу довольно много записей вроде:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

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

Я знаю о proxy_max_temp_file_size и установил его в 0, но это кажется мне немного неудобным (мой прокси пытается выполнить буферизацию, но у него нет файла, куда буферизовать ... как это может быть быстрее?).

Мои вопросы:

  1. Как мне удалить [предупреждение] и избежать буферизации ответов? Лучше выключить proxy_buffering или установить proxy_max_temp_file_size до 0? Зачем?

  2. Если nginx буферизует ответ: когда он обслуживает буферизованный ответ, кому и почему?

  3. Зачем nginx повороты proxy_buffering включен по умолчанию, а затем [предупреждает], если он действительно буферизует ответ?

  4. Когда ответ активирует эту опцию? Когда для обслуживания ответа требуется> несколько секунд (сколько?)? Это можно настроить?

TIA, ngw.

1) Как я могу убрать [предупреждение] и избежать буферизации ответов? Лучше отключить proxy_buffering или установить proxy_max_temp_file_size в 0? Зачем?

Вы должны установить proxy_max_temp_file_size до 0, чтобы удалить его. В proxy_buffering директива не имеет прямого отношения к предупреждению. Вы можете отключить его, чтобы вообще остановить буферизацию, но в целом это не рекомендуется (если это не требуется для Комета).

2) Если nginx буферизует ответ, когда он обслуживает буферизованный ответ, кому и почему?

Он обслуживается немедленно, но клиент обычно имеет гораздо более медленное соединение и не может потреблять данные ответа так же быстро, как это создается вашим приложением. Nginx пытается буферизовать весь ответ, чтобы выпустить ваше приложение как можно скорее.

Смотрите также: http://aosabook.org/en/nginx.html

3) Почему nginx включает proxy_buffering по умолчанию, а затем [предупреждает] вас, если он действительно буферизует ответ?

Как я уже упоминал, proxy_buffering не имеет прямого отношения к предупреждению. Обычно это необходимо для оптимизации работы прокси-сервера, и его отключение снижает производительность и пропускную способность.

Nginx предупреждает вас только тогда, когда ответ не помещается в настроенные буферы памяти. Вы можете проигнорировать предупреждение, если оно вам подходит.

4) Когда ответ активирует эту опцию? Когда для обслуживания ответа требуется> несколько секунд (сколько?)? Это можно настроить?

Он срабатывает при заполнении буферов памяти. Пожалуйста, посмотрите документацию, весь механизм объяснен: http://nginx.org/r/proxy_max_temp_file_size

Вы можете увеличить буферы памяти.

Следующая конфигурация отлично работает на моем сервере.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;