Nginx: upstream buffer size is too small while reading body — Исправление
При получении от бэкенда больших объемов данных или объемных JSON-ответов Nginx возвращает ошибку 502 Bad Gateway или генерирует предупреждение: upstream buffer size is too small while reading upstream body или an upstream response is buffered to a temporary file.
| Директива | Стандартный размер | Проблема при превышении |
|---|---|---|
proxy_buffer_size | 4k / 8k | Недостаточно места для чтения первичного блока ответа |
proxy_busy_buffers_size | 8k / 16k | Слишком малый объем буферов в состоянии отправки клиенту |
proxy_max_temp_file_size | 1024m | Сброс больших объемов данных на диск (I/O Bottleneck) |
- Запросы с крупным телом ответа выполняются со значительными задержками или прерываются.
- В логах фиксируется создание множества временных файлов в
/var/lib/nginx/proxy/.
- Откройте конфигурацию виртуального хоста Nginx.
- Пропорционально увеличьте размеры буферов проксирования в секции
httpилиlocation:location /api/ { proxy_pass http://backend_upstream; # Буфер для чтения заголовков ответа: proxy_buffer_size 128k; # Количество и размер буферов для тела ответа: proxy_buffers 8 128k; # Буферы, занятые передачей клиенту (должен быть >= proxy_buffer_size): proxy_busy_buffers_size 256k; # Размер разовой порции записи во временный файл на диске: proxy_temp_file_write_size 256k; } - Если ваши клиенты работают по быстрым сетям, а ответы бэкенда не требуют буферизации, отключите ее:
proxy_buffering off; - Проверьте конфигурацию на ошибки синтаксиса:
sudo nginx -t. - Примените изменения:
sudo systemctl reload nginx.
proxy_busy_buffers_size ДОЛЖНО быть меньше суммарного размера всех буферов proxy_buffers минус размер одного буфера, но при этом БОЛЬШЕ или РАВНО значению proxy_buffer_size. Несоблюдение этого правила приведет к ошибке запуска nginx: [emerg] "proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer.Частые вопросы (FAQ)
Почему Nginx пишет тело ответа во временные файлы на диске?
Если размер ответа бэкенда превышает суммарный объем proxy_buffers в оперативной памяти, Nginx начинает сбрасывать остаток данных во временные файлы на диске для предотвращения переполнения RAM.
Как полностью запретить Nginx использовать диск для буферизации ответов?
Установите директиву proxy_max_temp_file_size 0;. В этом случае при исчерпании буферов в памяти Nginx начнет читать данные из бэкенда синхронно со скоростью клиента.
Как эта проблема решается для FastCGI (PHP-FPM)?
Для FastCGI используются аналогичные директивы: fastcgi_buffer_size 128k; fastcgi_buffers 8 128k; fastcgi_busy_buffers_size 256k;.
Влияет ли увеличение буферов на потребление памяти Nginx?
Да, буферы выделяются под каждое активное клиентское соединение, поэтому при десятках тысяч одновременных запросов чрезмерно большие буферы могут привести к OOM.