Spec-Zone.ru › Varnish

Сжатие

В Varnish 3.0 мы представили встроенную поддержку сжатия, используя кодирование gzip. До версии 3.0 Varnish никогда не сжимал объекты.

В Varnish 4.0 сжатие по умолчанию включено («on»), что означает, что он старается быть умным и делать разумные вещи.

Если вы не хотите, чтобы Varnish изменял кодирование, вы можете полностью отключить сжатие, установив параметр http_gzip_support в значение false. Подробности см. в справке varnishd.

Поведение по умолчанию

Поведение по умолчанию активно, когда параметр http_gzip_support установлен в «on», и ни beresp.do_gzip, ни beresp.do_gunzip не используются в VCL.

Если возвращается не из vcl_recv с pipe или pass, Varnish изменяет req.http.Accept-Encoding: если клиент поддерживает gzip, req.http.Accept-Encoding устанавливается в «gzip», в противном случае заголовок удаляется.

Если запрос не является pass, Varnish устанавливает bereq.http.Accept-Encoding в «gzip» до выполнения vcl_backend_fetch, так что заголовок может быть изменен в VCL.

Если сервер отвечает сжатым содержимым (gzip), оно будет храниться в памяти в сжатом виде, и Accept-Encoding будет добавлен в заголовок Vary.

Для клиентов, поддерживающих gzip, сжатое содержимое передаётся без изменений.

Для клиентов, не поддерживающих gzip, сжатое содержимое распаковывается на лету при передаче. Заголовок ответа Content-Encoding удаляется, а любой Etag ослабляется (добавлением префикса «W/»).

Для поиска по Vary, Accept-Encoding игнорируется.

Сжатие содержимого, если бэкэнды этого не делают

Вы можете указать Varnish сжимать содержимое перед сохранением в кэше в vcl_backend_response, установив beresp.do_gzip в «true», как показано ниже:

sub vcl_backend_response {
    if (beresp.http.content-type ~ "text") {
        set beresp.do_gzip = true;
    }
}

С beresp.do_gzip установленным в «true», Varnish внесёт следующие изменения в заголовки результирующего объекта перед его вставкой в кэш:

  • установить obj.http.Content-Encoding в «gzip»
  • добавить «Accept-Encoding» в obj.http.Vary, если он ещё не присутствует
  • ослабить любые Etag (добавлением префикса «W/»)

Как правило, Varnish не сильно загружает ЦП, поэтому может быть полезнее, чтобы Varnish тратил циклы ЦП на сжатие содержимого, чем сервера веб- или приложений, которые, скорее всего, будут ограничены по ЦП.

Убедитесь, что вы не пытаетесь сжать несжимаемые данные, такие как файлы JPG, GIF и MP3. Вы только потратите циклы ЦП.

Распаковка содержимого перед вставкой в кэш

Вы также можете распаковать содержимое перед сохранением в кэше, установив beresp.do_gunzip в «true». Один из вариантов использования этой функции — обойти плохо настроенные бэкэнды, которые бесполезно сжимают уже сжатое содержимое, например, изображения JPG (но исправление плохого бэкэнда всегда является лучшим вариантом).

С beresp.do_gunzip установленным в «true», Varnish внесёт следующие изменения в заголовки результирующего объекта перед его вставкой в кэш:

  • удалить obj.http.Content-Encoding
  • ослабить любые Etag (добавлением префикса «W/»)

GZIP и ESI

Если вы используете Edge Side Includes (ESI), вы будете рады узнать, что ESI и GZIP работают очень хорошо вместе. Varnish волшебным образом распакует содержимое для обработки ESI, а затем снова сжимает его для эффективного хранения и доставки.

Отключение поддержки gzip

Когда параметр http_gzip_support установлен в «off», Varnish не выполняет ни одного из описанных выше изменений заголовков, обрабатывает Vary: Accept-Encoding так, как он бы обрабатывал любое другое значение Vary, и игнорирует beresp.do_gzip и beresp.do_gunzip.

Случайный отход от темы

Poul-Henning Kamp написал Как работает GZIP и GZIP+ESI в Varnish, где немного подробнее рассказывается о реализации.

Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/users-guide/compression.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API