Nginx: zero size buf in output while sending to client — Решение
Клиентский запрос внезапно прерывается на этапе передачи данных, а браузер отображает ошибку неполной загрузки контента (net::ERR_INCOMPLETE_CHUNKED_ENCODING). В журнале error.log Nginx фиксируется аварийная запись уровня [alert]: zero size buf in output t:1 r:1 f:0 while sending to client.
| Параметр дебага | Значение | Интерпретация ядра Nginx |
|---|---|---|
t:1 (temporary) | Буфер в оперативной памяти | Указывает, что поврежден временный буфер в RAM |
r:1 (recycled) | Флаг переиспользования | Буфер помечен как повторно используемый |
f:0 (file) | Буфер не на диске | Сбой произошел до или в процессе записи во временный файл |
- Nginx прерывает обработку цепочки фильтров вывода (output filter chain), отдавая оборванное тело ответа.
- Проблема часто активируется при одновременной работе gzip-сжатия, кэширования ответов и кастомных фильтров (Lua, SSI, Sub filter).
- Проверьте цепочку буферизации в проблемном блоке
location. Отключите двойное сжатие, если бэкенд уже сжимает ответы:# Запрещаем бэкенду отправлять сжатый контент в Nginx: proxy_set_header Accept-Encoding ""; - Скорректируйте параметры прокси-буферов, исключив создание буферов нулевого размера:
proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 8 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; - Если используется OpenResty или модуль
lua-nginx-module, убедитесь, что в фазеbody_filter_by_luaне передается пустая строкаngx.arg[1] = ""без корректной обработки флага завершения потокаngx.arg[2]. - В случае взаимодействия с gRPC или SSE (Server-Sent Events) отключите буферизацию полностью:
proxy_buffering off; proxy_cache off; - Протестируйте файл конфигурации и выполните перезапуск:
sudo nginx -t sudo systemctl reload nginx
body_filter_by_lua никогда нельзя устанавливать ngx.arg[1] = nil или отдавать пустой чанк данных, если флаг ngx.arg[2] (eof) равен false. Это приводит к созданию пустого буфера (zero size buf) и аварийному алерту Nginx.Частые вопросы (FAQ)
Что означает алерт zero size buf в Nginx?
Это внутренний сбой цепочки фильтров вывода Nginx: один из модулей (gzip, SSI, proxy, sub_filter или Lua) передал в очередь отправки сетевого драйвера буфер с нулевой длиной данных (start == end).
Почему пользователи видят ERR_INCOMPLETE_CHUNKED_ENCODING?
При возникновении алерта zero size buf Nginx немедленно закрывает TCP-соединение с клиентом, не отправив финальный завершающий нулевой чанк chunked-потока.
Может ли модуль gzip вызывать эту ошибку?
Да, если бэкенд отдает пустой ответ с кодом 204 No Content или 304 Not Modified, а gzip-фильтр пытается принудительно обернуть его в поток сжатия.
Как воспроизвести проблему для отладки?
Включите подробный логгинг error_log /var/log/nginx/error.log debug; и выполните серию параллельных запросов утилитой curl с флагом --raw.