У меня есть довольно большое и медленное (сложные данные, сложный интерфейс) веб-приложение, встроенное в 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, но это кажется мне немного неудобным (мой прокси пытается выполнить буферизацию, но у него нет файла, куда буферизовать ... как это может быть быстрее?).
Мои вопросы:
Как мне удалить [предупреждение] и избежать буферизации ответов? Лучше выключить proxy_buffering
или установить proxy_max_temp_file_size
до 0? Зачем?
Если nginx
буферизует ответ: когда он обслуживает буферизованный ответ, кому и почему?
Зачем nginx
повороты proxy_buffering
включен по умолчанию, а затем [предупреждает], если он действительно буферизует ответ?
Когда ответ активирует эту опцию? Когда для обслуживания ответа требуется> несколько секунд (сколько?)? Это можно настроить?
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;