Сжатие
В 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