nuckty
EN
Все разделы →

Сжатие

Движок создаёт копии Brotli и Gzip для выбранных непустых файлов в brotli/ и gzip/. Поддерживаются .html, .css, .js, .svg, .xml, .txt и имена без расширения из префикса _c, _j, _s или _i и ровно 16 шестнадцатеричных символов в нижнем регистре. robots.txt исключён. Обоснование — в решении о сжатии.

Два кодека

КодекФайлУровеньНазначение
Brotli.brQ11 (максимум)Основное представление, если клиент его принимает
Gzip.gz9Универсальный запасной вариант

В 1.0.0-beta1 других кодеков нет. Добавление кодека требует измерений и изменения контракта артефакта и хостинга.

site/html/how_bemjson.html        ← оригинал
site/brotli/how_bemjson.html.br   ← Brotli Q11
site/gzip/how_bemjson.html.gz     ← Gzip 9

Каждая сжатая копия сохраняет плоское имя оригинала и добавляет суффикс кодека. Каталоги brotli/ и gzip/ не отдаются напрямую — конфигурация nginx их закрывает.

Детерминизм сборки

Движок нормализует байт 9 (десятый по счёту) заголовка gzip (поле ОС) до 0xFF («неизвестно»), что устраняет разницу маркера ОС между macOS и Linux. Для одинаковых байтов также нужны совпадающие версии компрессора и рантайма. Разный маркер ОС меняет хэш сжатой копии и вызывает лишнюю загрузку при публикации по манифесту; сам манифест при этом остаётся корректным. Подробное обоснование — в решении о сжатии.

У Brotli такого заголовка нет, поэтому дополнительная нормализация ему не нужна.

Согласование на стороне сервера

Конфигурация хостинга ищет явные токены br и gzip с ненулевым q и выбирает доступную копию в фиксированном порядке: Brotli, затем Gzip, затем оригинал. Заголовок Content-Encoding соответствует выбранному файлу. Упрощённый поиск слова в заголовке эти правила не воспроизводит.

Правила не ранжируют кодеки по значению q и не выбирают кодек по одному *. Запасной вариант — исходный файл; identity;q=0 не заставляет сгенерированную конфигурацию вернуть 406. Если сайту нужен другой порядок согласования, измените его правила раздачи.

Зачем сжимать заранее, а не на лету

При сжатии на лету серверу нужны процессорные ресурсы. Их расход зависит от уровня сжатия, кеширования и конфигурации сервера. Nuckty выполняет эту работу при сборке и готовит копии Brotli Q11 и Gzip 9.

При запросе сгенерированная конфигурация выбирает подходящую готовую копию или оригинал. Для этого серверу нужны модули и настройки, описанные в инструкции по хостингу.

Что не сжимается

Отбор идёт по имени файла, без анализа содержимого. Файлы с другими именами, в том числе .json и обычными расширениями двоичных форматов, не получают сжатых копий; также исключены robots.txt и пустые файлы. .htaccess и manifest.json создаются после сжатия. Все копии лежат в плоских каталогах, поэтому коллизия одинаковых имён в разных исходных каталогах вызывает ошибку.