Nginx: gzip filter: zero input buffer received — Решение бага сжатия
Клиентские запросы завершаются сбросом сетевого соединения или повреждением получаемых веб-страниц. В системном журнале error.log регистрируется ошибка модуля сжатия: gzip filter: zero input buffer received while sending to client или http gzip filter buffer error.
| Компонент сбоя | Характер ответа | Причина ошибки |
|---|---|---|
Статус 204 No Content | Тело ответа полностью отсутствует | Модуль Gzip пытается сжать тело нулевого размера |
Статус 304 Not Modified | Заголовки без контента | Ошибочная попытка инициализации zlib-буфера |
| Upstream двойной gzip | Бэкенд уже вернул сжатый поток | Повторная передача бинарного сжатого потока в gzip filter |
- В логах фиксируются редкие предупреждения уровня
[alert]или[error], сопровождающиеся разрывом соединений. - Браузеры отображают ошибку
ERR_CONTENT_DECODING_FAILED.
- Проверьте глобальную конфигурацию модуля Gzip в
/etc/nginx/nginx.confи исключите некорректные типы ответов:http { gzip on; gzip_comp_level 5; gzip_min_length 256; # Не сжимать ответы размером менее 256 байт gzip_proxied any; gzip_vary on; # Сжимать строго текстовые MIME-типы: gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml; } - Если бэкенд сам выполняет сжатие ответов, запретите сжатие на стороне upstream:
location / { proxy_pass http://backend; # Сбрасываем Accept-Encoding для upstream, чтобы бэкенд отдавал сырой plain-text: proxy_set_header Accept-Encoding ""; } - Убедитесь, что в конфигурации включен модуль декомпрессии, если Nginx должен разжимать ответы для кэша:
gunzip on; - Проверьте конфигурацию:
sudo nginx -t. - Перезагрузите веб-сервер:
sudo systemctl reload nginx.
gzip_min_length 256; (или более) критически важна. Сжатие микро-ответов (размером менее 150-200 байт) не только не экономит трафик из-за оверхеда заголовков Gzip, но и может приводить к созданию пустых промежуточных буферов в zlib.Частые вопросы (FAQ)
Почему браузер выдает ERR_CONTENT_DECODING_FAILED?
Эта ошибка означает, что Nginx выставил заголовок 'Content-Encoding: gzip', но передал поврежденный или пустой поток данных, который распаковщик браузера не смог прочитать.
Зачем нужна директива gzip_vary on?
Она добавляет HTTP-заголовок 'Vary: Accept-Encoding', указывая браузерам и промежуточным CDN-кэшам отдавать разные версии страницы клиентам с поддержкой сжатия и без нее.
Стоит ли сжимать изображения форматов JPEG и PNG через Gzip?
Нет. Форматы JPEG, PNG, WebP и zip-архивы уже аппаратно сжаты. Попытка их gzip-сжатия только впустую тратит ресурсы CPU и увеличивает размер файла.
Что делает директива gzip_proxied any?
Она разрешает сжимать ответы, полученные от проксируемых upstream-серверов (по умолчанию Nginx сжимает только прямые статические ответы хоста).