1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 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 включён, а не сжимается»

  1. типа нет в gzip_types (text/html там всегда, его не пишут);
  2. файл меньше gzip_min_length;
  3. в запросе есть Via (CDN, чужой прокси), а gzip_proxied не разрешает - это не про ответы бэкенда: замер показывает, что без Via они жмутся, а с Via не жмётся даже файл с диска;
  4. клиент не прислал Accept-Encoding;
  5. ответ уже сжат бэкендом;
  6. 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, а для неизменяемой статики - предсжатие при сборке.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.