# конспект · шаг 5 из 5
Конспект: сжатие
Сжатие: что жать, чем и в каком порядке внедрять.
Как договариваются
запрос: Accept-Encoding: gzip, deflate, br, zstd
ответ: Content-Encoding: gzip
Vary: Accept-Encoding
Что сжимать
| Сжимать | Не сжимать |
|---|---|
| HTML, CSS, JS, JSON, XML, SVG | JPEG, PNG, WebP, AVIF |
шрифты .ttf, .otf, .eot |
.woff, .woff2 (сжаты внутри) |
.txt, .csv, .map, .wasm |
видео, аудио, .zip, .gz, .pdf |
Рабочий набор
gzip on;
gzip_vary on; # ВАЖНО: по умолчанию off
gzip_types text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024; # мелочь сжимать дороже, чем отдать
gzip_comp_level 5; # 9 стоит процессора, а даёт единицы процентов
gzip_proxied any; # иначе запросы с Via (то есть из-за CDN) не жмутся
Предсжатие снимает нагрузку совсем:
gzip_static on; # рядом лежит app.js.gz - отдадим его, не сжимая на лету
Шесть причин «gzip включён, а не сжимается»
- типа нет в
gzip_types(text/htmlтам всегда, его не пишут); - файл меньше
gzip_min_length; - в запросе есть
Via(CDN, чужой прокси), аgzip_proxiedне разрешает - это не про ответы бэкенда: замер показывает, что безViaони жмутся, а сViaне жмётся даже файл с диска; - клиент не прислал
Accept-Encoding; - ответ уже сжат бэкендом;
- HTTP/1.0 без
gzip_http_version 1.0.
Ловушки джокера
gzip_vary offпо умолчанию. БезVaryкеширующий прокси отдаст сжатый ответ клиенту, который сжатие не понимает. Симптом воспроизводится только через промежуточный кеш и только у части пользователей.- brotli и zstd не входят в стандартную сборку - это внешние модули, которые придётся пересобирать при каждом обновлении nginx.
- Порядок внедрения: gzip →
gzip_static→ и только потом brotli.
Что показал стенд
| опыт | результат |
|---|---|
gzip on, больше ничего |
data.json 120 391 байт - не сжат (в gzip_types только text/html) |
| типы добавлены | 2204 байта |
| 300 КБ текста, уровень 1 / 5 / 9 | 111 667 / 85 355 / 79 704 байта за 5,9 / 12,7 / 39,3 мс |
gzip_static on рядом с app.js.gz |
Content-Length: 262, ни такта на сжатие |
запрос с Via: 1.1 cdn, без gzip_proxied |
7637 байт вместо 166 - сжатие выключено |
Уровень 9 стоит втрое дороже пятого ради шести процентов байт: рабочий диапазон 4-6, а для неизменяемой статики - предсжатие при сборке.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий