Сжатие
Движок создаёт копии Brotli и Gzip для выбранных непустых файлов в brotli/ и gzip/. Поддерживаются .html, .css, .js, .svg, .xml, .txt и имена без расширения из префикса _c, _j, _s или _i и ровно 16 шестнадцатеричных символов в нижнем регистре. robots.txt исключён. Обоснование — в решении о сжатии.
Два кодека
| Кодек | Файл | Уровень | Назначение |
|---|---|---|---|
| Brotli | .br | Q11 (максимум) | Основное представление, если клиент его принимает |
| Gzip | .gz | 9 | Универсальный запасной вариант |
В 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 создаются после сжатия. Все копии лежат в плоских каталогах, поэтому коллизия одинаковых имён в разных исходных каталогах вызывает ошибку.