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

62

У меня довольно большой и медленный (комплекс данных, сложный интерфейс) сборки веб - приложений в 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
У меня такое ощущение, что вы путаете буферизацию с кэшированием. Буферизация - это процедура, которая позволяет загружать больше данных, чем позволяет выделение памяти.
Славянский

Ответы:

75

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

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

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

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

VBart
источник
5
Для # 1, как удаление ограничения размера временных файлов предотвращает предупреждение буферизации? Я не думаю, что это правильно, потому что я установил эту директиву на 0 и все еще получаю предупреждения.
Фил
Этот ответ недостаточно ясен. Лучше ли для производительности установить proxy_max_temp_file_sizeзначение 0или это только способ убрать это предупреждение?
Оффир Пеер
13

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

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Haluk
источник
2
Является ли вторая директива избыточной, то есть 16kпервая строка делает то же самое, что и вторая строка?
EoghanM
1
@EoghanM согласно документам, нет. Proxy_Buffer_size (буфер, а не множественное число) применяется к первой части ответа прокси-сервера (он же заголовки) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers для остальной части ответа.
CDE
2
Вы сохранили некоторые мои волосы сегодня. Я переносил nginx с нашего сервера в докер-контейнер, и он стал невероятно медленным. Это «исправило» это. Не уверен, была ли версия на нашем сервере включена по умолчанию или нет, но та, которая в контейнере, определенно нуждалась в этих настройках.
Кристиан