
У меня есть довольно большое и медленное (сложные данные, сложный фронтенд) веб-приложение, встроенное 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, но мне кажется, что это немного неудобно (мой прокси-сервер пытается буферизировать данные, но у него нет файла, куда можно было бы их буферизовать... как это может быть быстрее?).
У меня есть вопросы:
Как убрать [warn] и избежать буферизации ответов? Лучше отключить
proxy_buffering
или установитьproxy_max_temp_file_size
на 0? Почему?Если
nginx
буферизует ответ: когда он передает буферизованный ответ, кому и почему?Почему
nginx
включаетсяproxy_buffering
по умолчанию, а затем [предупреждает] вас, если на самом деле буферизует ответ?Когда ответ активирует эту опцию? Когда требуется > несколько секунд (сколько?) для обслуживания ответа? Это можно настроить?
TIA, нгв.
решение1
- Как убрать [warn] и избежать буферизации ответов? Лучше отключить proxy_buffering или установить proxy_max_temp_file_size на 0? Почему?
Вам следует установить proxy_max_temp_file_size
значение 0, чтобы удалить его. Директива proxy_buffering
не связана напрямую с предупреждением. Вы можете отключить ее, чтобы остановить буферизацию вообще, но это не рекомендуется делать в целом (если только это не нужно длякомета).
- Если nginx буферизует ответ, когда он передает буферизованный ответ, кому и почему?
Он обслуживает ответ немедленно, но клиент обычно имеет гораздо более медленное соединение и не может потреблять данные ответа так же быстро, как их производит ваше приложение. Nginx пытается буферизировать весь ответ, чтобы освободить ваше приложение как можно скорее.
Смотрите также:http://aosabook.org/en/nginx.html
- Почему nginx включает proxy_buffering по умолчанию, а затем [предупреждает] вас, если он действительно буферизует ответ?
Как я уже упоминал, proxy_buffering
напрямую не связан с предупреждением. Он обычно нужен для оптимизированных операций прокси, и его отключение ухудшает производительность и пропускную способность.
Nginx предупреждает только тогда, когда ответ не помещается в настроенные буферы памяти. Вы можете игнорировать предупреждение, если вас это устраивает.
- Когда ответ активирует эту опцию? Когда требуется > нескольких секунд (сколько?) для обслуживания ответа? Это можно настроить?
Срабатывает при заполнении буферов памяти. Пожалуйста, посмотрите документацию, там весь механизм объяснен:http://nginx.org/r/proxy_max_temp_file_size
Возможно, вам захочется увеличить буферы памяти.
решение2
Следующая конфигурация отлично работает на моем сервере.
proxy_buffers 16 16k;
proxy_buffer_size 16k;
решение3
Команда nginx sendfile может помочь в этом для статического контента.
https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/
Включение sendfile:
По умолчанию NGINX сам обрабатывает передачу файлов и копирует файл в буфер перед отправкой. Включение директивы sendfile устраняет этап копирования данных в буфер и позволяет напрямую копировать данные из одного файлового дескриптора в другой. Чтобы предотвратить полное заполнение рабочего процесса одним быстрым соединением, можно использовать директиву sendfile_max_chunk, чтобы ограничить объем данных, передаваемых за один вызов sendfile() (в этом примере до 1 МБ):
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
#...
}
решение4
Добавьте их в nginx.conf или контекст файла конфигурации виртуального хоста (http,сервер,расположение):
proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;
Вы можете задать значения в зависимости от ситуации, но они должны быть сбалансированы друг с другом (не используйте разные числа для директив буфера).
У меня та же проблема, и я тестирую эти конфигурации для скрипта с тяжелыми и длительными процессами ввода-вывода, SQL и PHP, и все работает нормально.