...

Пороги сжатия HTTP: оптимальные конфигурации для веб-хостинга

Пороги сжатия HTTP определяют размер, на который ваш сервер сжимает контент, и таким образом напрямую контролируют TTFB, загрузку процессора и пропускную способность. В этом руководстве я покажу вам конкретные пороги, уровни и настройки заголовков для быстрой доставки, а также четкое разделение между динамическим и статическим сжатием. Компрессия.

Центральные пункты

Сначала я кратко изложу самые важные настройки, чтобы вы могли целенаправленно приступить к работе и избежать лишней траты циклов процессора. Я полагаюсь на четкие пороги, подходящие уровни и чистые заголовки, чтобы браузеры, прокси и CDN работали правильно. Я различаю динамические ответы и активы сборки и держу под строгим контролем сжатие за скачок. Я минимизирую TTFB с помощью умеренных уровней сжатия во время выполнения и получаю максимальную скорость из предварительно сжатых файлов. Я регулярно проверяю показатели и корректирую ограничения в зависимости от реальной нагрузки, сочетания файлов и задержек, чтобы ваша система работала заметно эффективнее. быстрее завещание.

  • Порог 512-1024 B, стандартный 1024 B
  • Хлебные палочки 3-4 динамические, 9-11 статические
  • Gzip 5-6 в качестве запасного варианта
  • MIME Только текстовые ресурсы
  • Vary и ETag для кодировки

Что такое пороги сжатия HTTP?

Пороговое значение определяет размер, при превышении которого ответ сжимается, и предотвращает искусственное раздувание крошечных файлов за счет избыточных заголовков; именно в этом случае Безубыточность-соображения. При очень маленьких ответах кодирование содержимого может увеличить полезную нагрузку и одновременно потребовать затрат процессора. Поэтому я обычно устанавливаю нижний предел в 1024 байта или 512 байт для высокочастотных API с большим количеством маленьких ответов. Меньшие пороговые значения увеличивают степень сжатия, но они увеличивают TTFB и CPU, когда динамический контент сильно меняется. Большие пороги экономят вычислительное время, но рискуют потерять потенциал при работе с файлами HTML, CSS или JSON среднего размера и хорошего качества. Сокращение прибыль.

Brotli против Gzip: выбор и уровни

Brotli часто достигает на 15-21 процент лучших показателей, чем Gzip, для текстовых ресурсов, но требует больше процессорных затрат на запрос, что я учитываю при динамических ответах и умеренных уровнях. подушка. Для сжатия во время выполнения я использую Brotli уровня 3-4, для предварительно упакованных активов - уровня 9-11. Для устаревших клиентов или сильно изменяющегося контента я использую Gzip уровня 5-6. HTTP/2 и HTTP/3 выигрывают от хорошего сжатия, при условии, что буферы и точки смыва на сервере установлены правильно и поток не задерживается. Если вы хотите провести более глубокое сравнение, вы можете найти больше информации в моей статье Сравнение Gzip и Brotli дополнительные практические ценности и соображения, которые делают выбор в повседневной жизни облегчить.

Установите пороговые значения: Защитные ограждения и безубыточность

Я начинаю с 1024 байт в качестве базового порога, потому что тогда накладные расходы на заголовки явно компенсируются, а использование процессора остается разумным, особенно при работе с HTML и JSON, которые сильно различаются. сгущать оставьте. В сетях с очень низкой задержкой и большим количеством минимальных ответов API может быть полезно использовать 512 байт. Сжатие редко имеет смысл при объеме меньше 512 байт, поскольку затраты на администрирование часто превышают снижение полезной нагрузки. В случае сильно загруженных машин я временно повышаю порог, пока в резервуарах процессора снова не появятся буферы. Такая постепенная регулировка позволяет поддерживать низкий уровень TTFB и сохранять Стабильность всей системы.

Сжимайте типы MIME особым образом

Я сжимаю только текстовые MIME, такие как text/html, text/css, application/javascript, application/json и image/svg+xml, потому что они могут использоваться для избыточности. Выигрыши перетаскивание. Я оставляю бинарное содержимое, такое как image/*, application/pdf или font/woff2, нетронутым, так как эффект от этого небольшой или отрицательный. Для шрифтов я использую непосредственно WOFF2, поскольку он уже эффективно кодирует, и дальнейшее сжатие не имеет смысла. Я веду явные разрешительные списки и избегаю подстановочных знаков, чтобы бинарные файлы случайно не попали в кодировщик. Таким образом я сохраняю цепочку сжатия чистой и предотвращаю Коррупция из-за неправильной классификации.

Статика и динамика: чистое разделение

Я заранее упаковываю статические активы в процессе сборки или на границе CDN в форматы .br и .gz и позволяю серверу использовать эти варианты напрямую. доставить. Для динамических ответов я устанавливаю умеренные уровни и сохраняю буферы достаточно маленькими, чтобы первый блок байт проходил быстро. Важно сжимать только один хоп в цепочках прокси, чтобы не происходило двойного сжатия. Я могу отключить сжатие на Origin, если CDN уже сделал это и правильно разделил его через Vary. Такое разделение экономит процессор и обеспечивает постоянную Время реагирования даже под нагрузкой.

Управление заголовками и кэширование

Я всегда отправляю Vary: Accept-Encoding, чтобы кэши правильно различали варианты и не было промахов, замедляющих работу пользователей или фальсифицирующих активы; этот заголовок имеет вид решительный. Для статических файлов я задаю кодировку содержимого (br/gzip) плюс длину содержимого, в то время как динамические потоки часто работают с кодировкой передачи: chunked. ETags должны быть специфичными для кодировки, иначе кэш будет выдавать неверные версии. Я также устанавливаю длительные TTL кэша для предварительно сжатых активов и защищаю их с помощью управления кэшем: public, immutable, если хэши файлов находятся в имени. Я даю компактную отправную точку здесь: Настройка сжатия HTTP, который покажет вам самые важные строительные блоки в Последовательность показывает.

HTTP/2 и HTTP/3: промывка и буфер

При использовании HTTP/2 и HTTP/3 я обращаю внимание на ранние точки смыва, чтобы критические HTML и CSS не задерживали начало рендеринга. задержка. Слишком большие буферы могут замедлить мультиплексирование, поскольку один поток доминирует в планировании, а другой контент ждет. Я делаю первые блоки сжатия небольшими и отправляю быстро, затем увеличиваю размер блока для длинных файлов. Brotli показывает хорошие показатели при умеренных накладных расходах, если для динамических ответов используется уровень 3-4. При этом интерактивность остается высокой, а большие пакеты - эффективными. термоусадка.

Практика: Apache, Nginx, Caddy

Я начинаю с умеренных уровней и порога в 1024 байта, а затем систематически проверяю TTFB и CPU вместо того, чтобы вслепую устанавливать максимальные скорости. обеспечить соблюдение. Для Apache я активирую mod_deflate или mod_brotli и определяю только нужные типы MIME. В Nginx я устанавливаю gzip_min_length 1024 и Brotli в положение on, комбинируя это с brotli_static для предварительно сжатых файлов. Caddy предлагает простые переключатели с кодировками gzip zstd br; динамические пути с низкими уровнями я обрабатываю отдельно. По опыту, стоит взглянуть на Загрузка процессора и уровень сжатия, поскольку сочетание доли динамических ответов и количества ядер часто превышает предел. устанавливает.

Apache Пример (mod_deflate/mod_brotli):

AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml
 SetOutputFilter DEFLATE
 DeflateCompressionLevel 6
 DeflateBufferSize 64k


<IfModule mod_brotli.c
 AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript application/json image/svg+xml
 BrotliCompressionQuality 4
 BrotliWindowSize 22

Nginx Пример:

gzip включен;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
gzip_comp_level 5;

brotli включен;
brotli_comp_level 4;
brotli_static on;
brotli_types text/plain text/css application/json application/javascript image/svg+xml;

Мониторинг и устранение неисправностей

Я измеряю TTFB, загрузку процессора на одного рабочего и размер передачи по типам, чтобы понять, где сжатие помогает, а где оно необходимо. вредит. Если после активации TTFB увеличивается, я снижаю уровень или повышаю порог. Если возникают странные эффекты, я сначала проверяю, нет ли двойного сжатия, отсутствующих заголовков Vary или неправильно распознанных типов MIME. Я также обращаю внимание на политики CDN и WAF, поскольку второй хоп со сжатием смещает нагрузку и часто ухудшает время до первого байта. Для первоначальной проверки достаточно таких инструментов, как WebPageTest и Browser-DevTools. Аудит полностью.

Точки измерения и рекомендуемые значения

Я придерживаюсь нескольких четких параметров, чтобы конфигурация оставалась управляемой и при этом достигала высокого уровня качества. Эффект показывает. В следующей таблице приведены полезные пороговые значения, уровни и инструкции по кэшированию. Она охватывает типичные веб-стеки с HTML, CSS, JS, JSON, SVG и шрифтами. Настройте порог в зависимости от нагрузки, загрузки процессора и доли динамических ответов. Начните с консервативных значений, измерьте и итеративно перемещайте ползунки с небольшим шагом. Шаги.

Ресурс Порог (байт) Динамический (уровень) Статика (уровень) Подсказка для кэша
HTML 1024 Бр 3–4 / Гз 5–6 Br 9-11 (предварительно сжатые) Длинный TTL для имен хэшей
CSS/JS 1024 Редкая динамика Br 9-11 (предварительно сжатые) неизменяемые, варианты на хэш
JSON (API) 512-1024 Бр 3–4 / Гз 5–6 необычно Сохранять согласованность заголовков
SVG 1024 Редкая динамика Бр 9–11 Запросы на испытательный полигон
Шрифты (WOFF2) нет нет нет Не сжимайте дальше
Изображения (PNG/JPEG/WEBP) нет нет нет Отдельная оптимизация
PDF нет нет нет Избегайте кодирования

Zstd в контексте: когда это имеет смысл, когда нет

Я оцениваю Zstd независимо, потому что он обладает превосходными Пропускная способность с хорошим сжатием. Однако в браузерной среде поддержка неоднородна, поэтому я обычно не использую Zstd в качестве основной кодировки для конечных пользователей. Между внутренними сервисами или на магистральном маршруте CDN Zstd может быть очень полезен для сохранения эффективности трафика Origin CDN. На границе я придерживаюсь Brotli (для текста) и Gzip в качестве запасного варианта до тех пор, пока широко поддерживаемая клиентская база не обеспечит корректное согласование вариантов. В Caddy я оставляю Zstd опционально активным, но приоритет отдаю Переговоры Brotli перед Gzip, чтобы сбалансировать совместимость и производительность.

Запросы, загрузки и предварительно сжатые файлы

Большие загружаемые файлы (например, PDF-файлы, CSV) я проверяю отдельно. Для бинарных данных я обычно отключаю кодировку содержимого и передаю идентификационные данные (личность), чтобы запросы на диапазон работали правильно, а возобновление загрузки оставалось стабильным. Для статических текстовых файлов с вариантами .br/.gz я слежу за тем, чтобы сервер выбирал правильный вариант в зависимости от запроса клиента и чтобы длина содержимого, кодировка содержимого и ETag были согласованы. Для частичных запросов к сжатым вариантам диапазоны байт для сжатый длина - если стек не справляется с этим надежно, я передаю несжатую версию для запросов диапазона. Это смягчает крайние случаи и предотвращает некорректные перезапуски.

Безопасность: сжатие и утечка данных

Я принимаю во внимание побочные каналы, связанные с компрессией, такие как BREACH. Если ответы отражают секретно-зависимое содержимое (токены, идентификаторы сессий) рядом с входными данными, которые могут контролироваться злоумышленником, я выборочно отключаю сжатие или развязываю секреты (набивка, разделение на отдельные несжатые поля). Для путей входа и оплаты имеет смысл отключать сжатие с помощью заголовков или правил. Куки с установленными заголовками cookie не критичны, важно то, что Ответить-payload. Поэтому у меня есть готовые фильтры, нацеленные на путь, MIME или определенные шаблоны, чтобы легко применять эвристику.

Цепочки CDN и прокси: одно сжатие на один переход

Я четко определяю, в какой момент происходит сжатие: Либо на Край (CDN) или на Origin, но не в обоих случаях. Если CDN сжимает, я опускаю кодировку содержимого на Origin и отправляю Vary: Accept-Encoding, чтобы Edge собрал правильные варианты. Если Origin должен доставить предварительно сжатые активы (.br/.gz), я настраиваю Edge на отправку этих файлов в CDN. Прозрачный и не преобразует его снова. Если я хочу строго предотвратить преобразования промежуточными прокси (например, для соответствия требованиям), я устанавливаю Cache-Control: no-transform - тогда я планирую сжатие именно в месте происхождения. Для отладки я отмечаю, в каком месте Компрессия и хранить метрики отдельно для каждого хопа.

Потоковая передача, SSE, gRPC и WebSockets

Для событий, отправленных сервером (SSE), и подобных потоков я избегаю высоких уровней и большой буфера; в противном случае задержка заметно возрастает. Я использую небольшие блоки, частые промывки и более деактивированное сжатие, если интерактивность имеет приоритет. gRPC использует собственное сжатие сообщений и работает через HTTP/2 - здесь я избегаю дополнительного кодирования HTTP-контента, чтобы избежать дублирования. То же самое относится и к WebSockets: дефлейт каждого сообщения может быть полезен, но я включаю его только для действительно текстовых каналов и наблюдаю за тем. CPU-Эффект точный.

Сервер приложений: Установите специальные настройки уровня приложений

Я предпочитаю управлять пороговыми значениями в краевом/обратном прокси, но когда кадры сжимаются, я устанавливаю согласованные значения, чтобы ничего не работало друг против друга.

  • Node.js/ExpressЯ установил порог в 1024 байта и умеренные уровни. Статический обработчик обслуживает предварительно сжатые статические активы напрямую, я сжимаю только динамические маршруты для текстовых MIME.
  • Зайти на сайтЯ выбираю четкий разрешенный список MIME для каждого обработчика и пропускаю сжатие при размере менее 1 КБ. Для длинных потоков я поддерживаю небольшой объем записи, чтобы не перегружать первый paint. задержка.
  • Java/TomcatЯ использую compressionMinSize 1024 и веду список MIME в явном виде; бинарные типы не учитываются.

Tomcat Пример (коннектор server.xml):

<Connector port="8080" protocol="HTTP/1.1"
    compression="on"
    compressionMinSize="1024"
    noCompressionUserAgents=""
    compressableMimeType="text/html,text/css,application/javascript,application/json,image/svg+xml"
    URIEncoding="UTF-8" />

Важно: Если восходящий прокси (Nginx, Caddy) уже сжимает, я отключаю сжатие на уровне приложений, чтобы Дублирование работы и пусть ответственность несет только один слой.

Адаптивные пороги и управление нагрузкой

Я мыслю категориями политики, а не жесткими ценностями. При высокой нагрузке на процессор я поднимаю Порог временно (например, с 1024 до 2048 байт) или снижаю уровень Brotli (например, с 4 до 2) для динамических ответов. Если нагрузка падает, я снова увеличиваю значения. Это можно контролировать с помощью флага функции, переменных Env или простой перезагрузки. На узлах с небольшим количеством CPU я оставляю сжатие для наиболее важных MIME (HTML/JSON), в то время как CSS/JS почти полностью предварительно сжимаются из хранилища/CDN. Это Расстановка приоритетов сохраняет стабильность TTFB, а не переходит в пик.

Тестовый учебник: быстрая проверка

Я проверяю эффект с помощью нескольких воспроизводимых действий:

  • Переговоры: curl -I -H „Accept-Encoding: br“ https://example.com - проверка Content-Encoding, Vary и Content-Length.
  • Обратная связь: curl -I -H „Accept-Encoding: gzip“ - ожидается gzip? ETag отличается от Brotli?
  • Без сжатияcurl -I -H „Accept-Encoding: identity“ - Сравните разницу в размере и TTFB.
  • диапазон: curl -I -H „Range: bytes=0-1023“ - правильно ли сервер принимает поддиапазоны, и соответствует ли Content-Range?
  • DevToolsСравните размер „По сети“ и „Размер ресурса“, чтобы определить реальный Сбережения посмотреть.

Краткое резюме

Для начала установите порог в 1024 байта, проверьте TTFB и CPU и точно настройте параметры с помощью небольших Корректировки после. Используйте Brotli 3-4 для динамического контента и 9-11 для предварительно сжатых активов, а Gzip 5-6 оставьте в качестве запасного варианта. Сжимайте только текстовые MIME-файлы и доставляйте предварительно сжатые файлы напрямую, чтобы обеспечить легкость и долговечность сборки. Обратите внимание на Vary: Accept-Encoding, Content-Encoding и ETags, специфичные для кодировки, чтобы кэши работали корректно. Правильно настроенные пороги сжатия HTTP позволяют заметно ускорить доставку, не нагружая машину лишней вычислительной работой. блок.

Текущие статьи

Фотореалистичный сервер с визуализацией политик жизненного цикла хранилища объектов
облачные вычисления

Политики жизненного цикла объектного хранилища: оптимизация в хостинге

Политики жизненного цикла объектного хранилища оптимизируют хранение в хостинге благодаря автоматизации хранения и жизненному циклу хостинга s3 - сокращение расходов, повышение производительности.

Серверная стойка с синхронизацией времени NTP и сетевыми системами в современном центре обработки данных
Серверы и виртуальные машины

Синхронизация времени сервера с помощью NTP и Chrony в хостинге: исчерпывающее руководство

Руководство по синхронизации времени сервера с NTP Chrony в хостинге. Узнайте об управлении временем в Linux, иерархии страт и безопасной синхронизации времени.