відповідь вище за течією буферується до тимчасового файлу


61

У мене є досить великі і повільні (складні дані, складний інтерфейс) веб - додаток , побудувати в 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_size0? Чому?

  2. Якщо nginxбуферизує відповідь: Коли він подає буферизовану відповідь, кому і чому?

  3. Чому він nginxвключається proxy_bufferingза замовчуванням, а потім [попереджає] вас, якщо він насправді буферизує відповідь?

  4. Коли відповідь запускає цю опцію? Коли для отримання відповіді потрібно> кілька секунд (скільки?)? Це налаштовується?

ТІА, нгв.


1
У мене таке відчуття, що ви плутаєте буферизацію з кешуванням. Буферизація - це процедура, яка дозволяє завантажувати більше даних, ніж дозволено розподілом пам'яті.
Слов'янський

Відповіді:


75

1) Як я можу видалити [попередження] та уникнути буферних відповідей? Чи краще вимкнути proxy_buffering або встановити proxy_max_temp_file_size на 0? Чому?

Ви повинні встановити proxy_max_temp_file_size0, щоб видалити його. 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

Ви можете збільшити буфери пам'яті.


5
Як №1, як видалення обмеження розміру тимчасових файлів запобігає попередженню буферизації? Я не думаю, що це правильно, тому що мені ця директива встановлена ​​на 0 і все ще отримую попередження.
Філ

Відповідь на це питання не досить ясно, є чи це краще для продуктивності , щоб встановити , proxy_max_temp_file_sizeщоб 0або це тільки спосіб видалити це попередження?
Offir Pe'er

12

Наступна конфігурація працює на моєму сервері.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

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 з нашого сервера в контейнер докера, і він почав бути НЕВЕРДАЛЬНО повільним. Це "зафіксувало" це. Не впевнений, чи була версія на нашому сервері за замовчуванням увімкнена, чи ні, але версія цього контейнера, безумовно, потребувала цих налаштувань.
Крістіян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.