Spec-Zone.ru › Varnish

Переменные VCL

Полный альбом

Раздел руководства:

7

ОПИСАНИЕ

Это список всех переменных языка VCL.

Имена переменных имеют вид scope.variable[.index], например:

req.url
beresp.http.date
client.ip

Ниже описаны возможные операции с каждой переменной, часто с использованием сокращений «backend», которое охватывает подпрограммы vcl_backend_* {}, и «client», которое охватывает всё остальное, кроме vcl_init {} и vcl_fini {}.

Локальный, серверный, удалённый и клиентский

Эти переменные описывают сетевое соединение между клиентом и varnishd.

Без протокола PROXY:

     client    server
     remote    local
       v          v
CLIENT ------------ VARNISHD

С протоколом PROXY:

     client    server   remote     local
       v          v       v          v
CLIENT ------------ PROXY ------------ VARNISHD

client.identity

Тип: STRING

Доступно для чтения: клиент, backend

Доступно для записи: клиент

Идентификация клиента, используемая для балансировки нагрузки в клиентском директоре. По умолчанию client.ip

Эта переменная может быть перезаписана более точной информацией, например, извлеченной из заголовка Cookie:.

client.ip

Тип: IP

Доступно для чтения: клиент, backend

IP-адрес клиента, либо такой же, как remote.ip, либо тот, что указан в протоколе PROXY.

server.hostname

Тип: STRING

Доступно для чтения: все

Имя хоста сервера, возвращаемое системной функцией gethostname(3).

server.identity

Тип: STRING

Доступно для чтения: все

Идентификатор сервера, установленный параметром -i.

Если параметр -i не передан в varnishd, будет использовано значение, возвращаемое системной функцией gethostname(3).

server.ip

Тип: IP

Доступно для чтения: клиент, backend

IP-адрес сокета, на котором было получено клиентское соединение, либо такой же, как server.ip, либо тот, что указан в протоколе PROXY.

remote.ip

Тип: IP

Доступно для чтения: клиент, backend

IP-адрес другого конца TCP-соединения. Может быть IP-адресом клиента или исходящим IP-адресом прокси-сервера.

Если соединение — сокет доменного сокета Unix, значение будет 0.0.0.0:0

local.endpoint VCL >= 4.1

Тип: STRING

Доступно для чтения: клиент, backend

Адрес сокета «-a», на котором было принято соединение.

Если аргумент был -a foo=:81, это будет «:81»

local.ip

Тип: IP

Доступно для чтения: клиент, backend

IP-адрес (и номер порта) локального конца TCP-соединения, например 192.168.1.1:81.

Если соединение — сокет доменного сокета Unix, значение будет 0.0.0.0:0

local.socket VCL >= 4.1

Тип: STRING

Доступно для чтения: клиент, backend

Имя сокета «-a», на котором было принято соединение.

Если аргумент был -a foo=:81, это будет «foo».

Обратите внимание, что все сокеты «-a» получают имя по форме a%d, если имя не указано.

req и req_top

Эти переменные описывают текущий запрос, и когда обрабатываются запросы ESI:include, req_top указывает на запрос, полученный от клиента.

req

Тип: HTTP

Доступно для чтения: клиент

Вся структура данных запроса HTTP. В основном полезна для передачи в VMOD.

req.backend_hint

Тип: BACKEND

Доступно для чтения: клиент

Доступно для записи: клиент

Установите bereq.backend на это значение, если мы пытаемся выполнить запрос. При установке на директиву, чтение этой переменной возвращает фактический backend, если директива разрешила его немедленно, или директиву иначе. При использовании в контексте строки возвращает имя директора или бэкенда соответственно.

req.can_gzip

Тип: BOOL

Доступно для чтения: клиент

Истина, если клиент предоставил gzip или x-gzip в заголовке Accept-Encoding.

req.esi VCL <= 4.0

Тип: BOOL

Доступно для чтения: клиент

Доступно для записи: клиент

Установите в false, чтобы отключить обработку ESI независимо от значения beresp.do_esi. По умолчанию true. Эта переменная заменена на resp.do_esi в VCL 4.1.

req.esi_level

Тип: INT

Доступно для чтения: клиент

Счётчик уровней вложенных запросов ESI.

req.grace

Тип: DURATION

Доступно для чтения: клиент

Доступно для записи: клиент

Предельное время действия объекта.

Во время поиска используется минимальное значение из req.grace и хранимого значения grace объекта.

req.hash

Тип: BLOB

Доступно для чтения: vcl_hit, vcl_miss, vcl_pass, vcl_purge, vcl_deliver

Хеш-ключ этого запроса. В основном полезно для передачи в VMOD, но также может быть полезно для отладки статуса hit/miss.

req.hash_always_miss

Тип: BOOL

Доступно для чтения: клиент

Доступно для записи: клиент

По умолчанию: false.

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

Полезно для принудительного обновления кэша без аннулирования существующих записей в случае неудачи запроса.

req.hash_ignore_busy

Тип: BOOL

Доступно для чтения: клиент

Доступно для записи: клиент

По умолчанию: false.

Игнорировать любой занятый объект во время поиска в кэше.

Нужно использовать только когда два сервера ищут контент друг от друга, чтобы избежать тупиков.

req.hash_ignore_vary

Тип: BOOL

Доступно для чтения: клиент

Доступно для записи: клиент

По умолчанию: false.

Игнорировать заголовки vary объектов во время поиска в кэше.

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

Используйте с осторожностью.

req.http.*

Тип: HEADER

Доступно для чтения: клиент

Доступно для записи: клиент

Нельзя установить из: клиент

Заголовки запроса, например req.http.date.

RFC позволяют несколько заголовков с одинаковым именем, и как set, так и unset удалят все заголовки с данным именем.

Имя заголовка * является символом VCL и, например, не может начинаться с цифры. Для работы с допустимыми заголовками, которые не могут быть представлены как символы VCL, можно использовать кавычки, например req.http."grammatically.valid". Ни один из заголовков HTTP, присутствующих в реестрах IANA, не нуждается в кавычках, поэтому синтаксис с кавычками не рекомендуется, но доступен для межсетевого взаимодействия.

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

req.http.content-length

Тип: HEADER

Доступно для чтения: клиент

Поле заголовка content-length защищено, см. protected_headers.

req.http.transfer-encoding

Тип: HEADER

Доступно для чтения: клиент

Поле заголовка transfer-encoding защищено, см. protected_headers.

req.is_hitmiss

Тип: BOOL

Доступно для чтения: клиент

Если данный запрос привёл к промаху кэша

req.is_hitpass

Тип: BOOL

Доступно для чтения: клиент

Если данный запрос привёл к попаданию в кэш

req.method

Тип: STRING

Доступно для чтения: клиент

Доступно для записи: клиент

Метод запроса (например, «GET», «HEAD», …)

req.proto VCL <= 4.0

Тип: STRING

Доступно для чтения: клиент

Доступно для записи: клиент

Версия протокола HTTP, используемая клиентом, обычно «HTTP/1.1» или «HTTP/2.0».

req.proto VCL >= 4.1

Тип: STRING

Доступно для чтения: клиент

Версия протокола HTTP, используемая клиентом, обычно «HTTP/1.1» или «HTTP/2.0».

req.restarts

Тип: INT

Доступно для чтения: клиент

Количество перезапусков запроса.

req.storage

Тип: STEVEDORE

Доступно для чтения: клиент

Доступно для записи: клиент

Бэкенд хранения для сохранения тела запроса.

req.time

Тип: TIME

Доступно для чтения: клиент

Время, когда запрос был полностью получен, остаётся неизменным при перезапусках.

req.trace

Тип: BOOL

Доступно для чтения: клиент

Доступно для записи: клиент

Управление выводом записей VSL для текущего запроса, см. VSL.

По умолчанию соответствует значению параметра feature trace, см. varnishd. Не сбрасывается при отмене.

req.transport

Тип: STRING

Доступно для чтения: клиент

Протокол передачи, который доставил этот запрос.

req.ttl

Тип: DURATION

Доступно для чтения: клиент

Доступно для записи: клиент

Максимальный срок хранения объекта для кэширования.

req.url

Тип: STRING

Доступно для чтения: клиент

Доступно для записи: клиент

Запрошенный URL, например «/robots.txt».

req.xid

Тип: INT

Доступно для чтения: клиент

Уникальный идентификатор этого запроса.

req_top.http.*

Тип: HEADER

Доступно для чтения: клиент

Заголовки HTTP верхнего уровня запроса в дереве запросов ESI. Идентично req.http в запросах, не связанных с ESI.

См. req.http для общих замечаний.

req_top.method

Тип: STRING

Доступно для чтения: клиент

Метод запроса верхнего уровня в дереве запросов ESI. (например, «GET», «HEAD»). Идентично req.method в запросах, не связанных с ESI.

req_top.proto

Тип: STRING

Доступно для чтения: клиент

Версия протокола HTTP верхнего уровня в дереве запросов ESI. Идентично req.proto в запросах, не связанных с ESI.

req_top.time

Тип: TIME

Доступно для чтения: клиент

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

req_top.url

Тип: STRING

Доступно для чтения: клиент

Запрошенный URL верхнего уровня запроса в дереве запросов ESI. Идентично req.url в запросах, не связанных с ESI.

bereq

Это запрос, который мы отправляем на бэкенд, он создается из полей клиента req.*, отфильтровывая поля «per-hop», которые не должны передаваться (Connection:, Range: и аналогичные).

Для pass` fetches than for `miss` fetches, for instance ``Range разрешено несколько больше полей.

bereq

Тип: HTTP

Чтение из: бэкенд

Полная структура данных запроса HTTP для бэкенда. В основном полезна в качестве аргумента для VMOD.

bereq.backend

Тип: БЭКЕНД

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

Это бэкенд или дирижёр, который мы пытаемся получить. При установке на дирижёра, чтение этой переменной возвращает фактический бэкенд, если дирижёр разрешил его сразу, в противном случае — дирижёр. При использовании в строковом контексте возвращает имя дирижёра или бэкенда соответственно.

bereq.between_bytes_timeout

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Чтение из: бэкенд

Запись в: бэкенд

По умолчанию: атрибут .between_bytes_timeout из Определения бэкенда, который по умолчанию равен параметру between_bytes_timeout, см. varnishd.

Время в секундах ожидания между каждым полученным байтом от бэкенда. Недоступно в режиме pipe.

bereq.body

Тип: ТЕЛО

Не задается из: vcl_backend_fetch

Тело запроса.

Отключение также удалит bereq.http.content-length.

bereq.connect_timeout

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

По умолчанию: атрибут .connect_timeout из Определения бэкенда, который по умолчанию равен параметру connect_timeout, см. varnishd.

Время в секундах ожидания установления соединения с бэкендом.

bereq.first_byte_timeout

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Чтение из: бэкенд

Запись в: бэкенд

По умолчанию: атрибут .first_byte_timeout из Определения бэкенда, который по умолчанию равен параметру first_byte_timeout, см. varnishd.

Время в секундах ожидания получения первого байта от бэкенда. Недоступно в режиме pipe.

bereq.hash

Тип: БЛОК

Чтение из: vcl_pipe, бэкенд

Ключ хеша этого запроса, копия req.hash.

bereq.http.*

Тип: ЗАГОЛОВОК

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

Не задается из: vcl_pipe, бэкенд

Заголовки, которые будут отправлены на бэкенд.

См. req.http для общих замечаний.

bereq.http.content-length

Тип: ЗАГОЛОВОК

Чтение из: бэкенд

Поле заголовка content-length защищено, см. protected_headers.

bereq.http.transfer-encoding

Тип: ЗАГОЛОВОК

Чтение из: бэкенд

Поле заголовка transfer-encoding защищено, см. protected_headers.

bereq.is_bgfetch

Тип: BOOL

Чтение из: бэкенд

Истинно для запросов, где клиент получил попадание в объект grace, и этот запрос был запущен в фоновом режиме для получения свежей копии.

bereq.is_hitmiss

Тип: BOOL

Чтение из: бэкенд

Если этот запрос бэкенда был вызван hitmiss.

bereq.is_hitpass

Тип: BOOL

Чтение из: бэкенд

Если этот запрос бэкенда был вызван hitpass.

bereq.method

Тип: СТРОКА

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

Тип запроса (например, «GET», «HEAD»).

Регулярные (не pipe, не pass) запросы всегда «GET»

bereq.proto VCL <= 4.0

Тип: СТРОКА

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

Версия протокола HTTP, «HTTP/1.1», если запрос pass или pipe имеет «HTTP/1.0» в req.proto

bereq.proto VCL >= 4.1

Тип: СТРОКА

Чтение из: vcl_pipe, бэкенд

Версия протокола HTTP, «HTTP/1.1», если запрос pass или pipe имеет «HTTP/1.0» в req.proto

bereq.retries

Тип: ЦЕЛОЕ

Чтение из: бэкенд

Количество попыток повторного выполнения этого запроса.

bereq.time

Тип: ВРЕМЯ

Чтение из: vcl_pipe, бэкенд

Время, когда мы начали подготовку первого запроса к бэкенду, остается постоянным при повторных попытках.

bereq.trace

Тип: BOOL

Чтение из: бэкенд

Запись в: бэкенд

Управляет тем, генерируются ли записи VSL VCL_trace для текущего запроса, см. VSL.

Наследует значение req.trace при создании запроса к бэкенду. Не сбрасывается при отмене.

bereq.uncacheable

Тип: BOOL

Чтение из: бэкенд

Указывает, является ли этот запрос некэшируемым из-за pass со стороны клиента или попадания в объект hit-for-pass.

bereq.url

Тип: СТРОКА

Чтение из: vcl_pipe, бэкенд

Запись в: vcl_pipe, бэкенд

Запрашиваемый URL, скопированный из req.url

bereq.xid

Тип: ЦЕЛОЕ

Чтение из: vcl_pipe, бэкенд

Уникальный идентификатор этого запроса.

beresp

Полученный от бэкенда ответ, при промахе кэша, объект хранилища создаётся из beresp.

beresp

Тип: HTTP

Доступно в: vcl_backend_response, vcl_backend_error

Полная структура HTTP-ответа бэкенда, полезна в качестве аргумента для функций VMOD.

beresp.age

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: Заголовок Age или ноль.

Возраст объекта.

beresp.backend

Тип: БЭКЕНД

Доступно в: vcl_backend_response, vcl_backend_error

Бэкенд, с которого был получен ответ. Если в bereq.backend был задан дирижёр, это будет бэкенд, выбранный дирижёром. При использовании в строковом контексте возвращает его имя.

beresp.backend.ip VCL <= 4.0

Тип: IP

Доступно в: vcl_backend_response

IP-адрес бэкенда, с которого был получен ответ.

beresp.backend.name

Тип: СТРОКА

Доступно в: vcl_backend_response, vcl_backend_error

Имя бэкенда, с которого был получен ответ. Совпадает с beresp.backend.

beresp.body

Тип: ТЕЛО

Записывается в: vcl_backend_error

Для создания синтетического тела.

beresp.do_esi

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: false.

Установите в значение true, чтобы разобрать объект на директивы ESI. Это необходимо для последующей обработки ESI на стороне клиента. Если beresp.do_esi имеет значение false, когда объект попадает в кэш, обработка ESI на стороне клиента невозможна (obj.can_esi будет false).

Использование beresp.do_esi после установки beresp.filters является ошибкой VCL.

beresp.do_gunzip

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: false.

Установите в значение true, чтобы сжать объект с помощью gzip при его сохранении в кэше.

Если функция http_gzip_support отключена, установка этой переменной не имеет эффекта.

Использование beresp.do_gunzip после установки beresp.filters является ошибкой VCL.

beresp.do_gzip

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: false.

Установите в значение true, чтобы сжать объект с помощью gzip при его сохранении.

Если функция http_gzip_support отключена, установка этой переменной не имеет эффекта.

Использование beresp.do_gzip после установки beresp.filters является ошибкой VCL.

beresp.do_stream

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: true.

Передать объект клиенту, предварительно загрузив его целиком в varnish.

Для неукэшируемых объектов хранилище частей тела, которые были отправлены клиенту, может быть освобождено раньше, в зависимости от используемого механизма хранилища.

Эта переменная не имеет эффекта, если beresp.do_esi имеет значение true или если тело ответа пустое.

beresp.filters

Тип: СТРОКА

Доступно в: vcl_backend_response

Записывается в: vcl_backend_response

Список фильтров процессора извлечения Varnish (VFP), через которые будет проходить beresp.body. Порядок слева направо указывает обработку от бэкенда к кэшу, то есть фильтр слева обрабатывается первым по отношению к телу, полученному от бэкенда после декодирования любых кодировок передачи.

Фильтры VFP изменяют тело перед попаданием в кэш и/или передачей на клиентскую сторону, где оно может быть обработано ещё раз с помощью resp.filters.

В varnish-cache существуют следующие фильтры VFP:

  • gzip: сжимает тело с помощью gzip
  • testgunzip: Проверяет, является ли тело валидным gzip, и отказывается от него в противном случае
  • gunzip: Разжимает gzip-контент
  • esi: Обрабатывает текстовый контент ESI
  • esi_gzip: Сохраняет сжатые фрагменты для эффективной обработки ESI

    Этот фильтр позволяет объединять ESI из отдельных сжатых фрагментов, экономя вычислительные ресурсы для повторного сжатия на стороне клиента в ущерб некоторой эффективности сжатия.

Дополнительные фильтры VFP доступны из VMOD.

По умолчанию beresp.filters формируется следующим образом:

  • gunzip добавляется для сжатого контента, если beresp.do_gunzip или beresp.do_esi имеют значение true.
  • esi_gzip добавляется, если beresp.do_esi имеет значение true вместе с beresp.do_gzip или контент уже сжат.
  • esi добавляется, если beresp.do_esi имеет значение true
  • gzip добавляется для несжатого контента, если beresp.do_gzip имеет значение true
  • testgunzip добавляется для сжатого контента, если beresp.do_gunzip имеет значение false.

После установки beresp.filters использование любого из упомянутых ранее beresp.do_* переключателей является ошибкой VCL.

beresp.grace

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: Директива Cache-Control stale-while-revalidate или параметр default_grace.

Установите период, чтобы включить grace.

beresp.http.*

Тип: ЗАГОЛОВОК

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Не может быть установлено: vcl_backend_response, vcl_backend_error

HTTP-заголовки, возвращённые сервером.

См. req.http для общих замечаний.

beresp.http.content-length

Тип: ЗАГОЛОВОК

Доступно в: vcl_backend_response, vcl_backend_error

Поле заголовка content-length защищено, см. protected_headers.

beresp.http.transfer-encoding

Тип: ЗАГОЛОВОК

Доступно в: vcl_backend_response, vcl_backend_error

Поле заголовка transfer-encoding защищено, см. protected_headers.

beresp.keep

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: параметр default_keep.

Установите период, чтобы включить условные запросы к бэкенду.

Время keep — это срок жизни кэша в дополнение к ttl.

Объекты со сроком ttl, истекшим, но с оставшимся временем keep могут быть использованы для отправки условных (If-Modified-Since/If-None-Match) запросов к бэкенду для их обновления.

beresp.proto VCL <= 4.0

Тип: СТРОКА

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Версия HTTP-протокола, возвращённая бэкендом.

beresp.proto VCL >= 4.1

Тип: СТРОКА

Доступно в: vcl_backend_response, vcl_backend_error

Версия HTTP-протокола, возвращённая бэкендом.

beresp.reason

Тип: СТРОКА

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

HTTP-сообщение со статусом, возвращённое сервером.

beresp.status

Тип: ЦЕЛОЕ

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

HTTP-код статуса, возвращённый сервером.

Дополнительная информация в разделе HTTP-статус ответа.

beresp.storage

Тип: STEVEDORE

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Хранилище бэкенда, которое нужно использовать для сохранения этого объекта.

beresp.storage_hint VCL <= 4.0

Тип: СТРОКА

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Устарело с версии varnish 5.1 и снято с поддержки с версии VCL 4.1 (varnish 6.0). Используйте beresp.storage вместо него.

Подсказка для Varnish, что этот объект нужно сохранить в определённом хранилище бэкенда.

beresp.time

Тип: ВРЕМЯ

Доступно в: vcl_backend_response, vcl_backend_error

Время, когда заголовки бэкенда были полностью получены непосредственно перед тем, как была вызвана функция vcl_backend_response {} или когда была вызвана функция vcl_backend_error {}.

beresp.transit_buffer

Тип: БАЙТЫ

Доступно в: vcl_backend_response

Записывается в: vcl_backend_response

Значение по умолчанию: параметр transit_buffer, см. varnishd.

Максимальное количество байтов, на которое клиент может опережать бэкенд во время потоковой передачи, если beresp неукэшируемый. Также см. документацию параметра transit_buffer в varnishd.

beresp.ttl

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Значение по умолчанию: директивы Cache-Control s-maxage или max-age или значение, вычисленное из крайнего срока действия заголовка Expires, или параметр default_ttl.

Оставшееся время жизни объекта в секундах.

beresp.uncacheable

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

Записывается в: vcl_backend_response, vcl_backend_error

Унаследованно от bereq.uncacheable, см. там.

Установка этой переменной делает объект неукэшируемым.

Это может привести к созданию объекта hit-for-miss в кэше.

Очистка переменной не имеет эффекта и выведет предупреждение «Игнорируется попытка сброса beresp.uncacheable».

beresp.was_304

Тип: БУЛЕВО

Доступно в: vcl_backend_response, vcl_backend_error

При получении true, это указывает на то, что мы получили ответ 304 на наш условный запрос к бэкенду и превратили его в beresp.status = 200

obj

Это объект, найденный в кэше. Его нельзя изменить.

obj.age

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: vcl_hit, vcl_deliver

Возраст объекта.

obj.can_esi

Тип: ЛОГИЧЕСКОЕ

Доступно из: vcl_hit, vcl_deliver

Если объект можно обработать с помощью ESI, то есть если установка resp.do_esi или добавление esi к resp.filters в vcl_deliver {} вызовет обработку тела ответа с помощью ESI.

obj.grace

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: vcl_hit, vcl_deliver

Период действия объекта в секундах.

obj.hits

Тип: ЦЕЛОЕ

Доступно из: vcl_hit, vcl_deliver

Количество попаданий в кэш для этого объекта.

В vcl_deliver значение 0 указывает на промах в кэше.

obj.http.*

Тип: ЗАГОЛОВОК

Доступно из: vcl_hit

HTTP-заголовки, хранящиеся в объекте.

См. req.http для общих сведений.

obj.keep

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: vcl_hit, vcl_deliver

Период хранения объекта в секундах.

obj.proto

Тип: СТРОКА

Доступно из: vcl_hit

Версия протокола HTTP, хранящаяся в объекте.

obj.reason

Тип: СТРОКА

Доступно из: vcl_hit

Фраза причины HTTP, хранящаяся в объекте.

obj.status

Тип: ЦЕЛОЕ

Доступно из: vcl_hit

Код состояния HTTP, хранящийся в объекте.

Дополнительная информация в разделе HTTP-статус ответа.

obj.storage

Тип: STEVEDORE

Доступно из: vcl_hit, vcl_deliver

Хранилище, где хранится этот объект.

obj.time

Тип: ВРЕМЯ

Доступно из: vcl_hit, vcl_deliver

Время создания объекта с точки зрения сервера, который его сгенерировал. Это примерно эквивалентно now - obj.age.

obj.ttl

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: vcl_hit, vcl_deliver

Остающееся время жизни объекта в секундах.

obj.uncacheable

Тип: ЛОГИЧЕСКОЕ

Доступно из: vcl_deliver

Является ли объект некэшируемым (пропустить, попадание для пропуска или попадание для промаха).

resp

Это ответ, который мы отправляем клиенту. Он создаётся либо из beresp (пропуск/промах), либо из obj (попадания) или создаётся с нуля (synth).

За исключением resp.body, все resp.* переменные доступны как в vcl_deliver{}, так и в vcl_synth{} по принципу симметрии.

resp

Тип: HTTP

Доступно из: vcl_deliver, vcl_synth

Полная структура данных ответа HTTP, удобная в качестве аргумента для VMOD.

resp.body

Тип: ТЕЛО

Записывается из: vcl_synth

Для создания синтетического тела ответа, например, для ошибок.

resp.do_esi VCL >= 4.1

Тип: ЛОГИЧЕСКОЕ

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

По умолчанию: obj.can_esi

Это можно использовать для выборочного отключения обработки ESI, даже если обработка ESI произошла во время извлечения (см. beresp.do_esi). Это полезно, когда кэши Varnish обмениваются данными друг с другом.

Использование resp.do_esi после установки resp.filters является ошибкой VCL.

resp.filters

Тип: СТРОКА

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

Список фильтров VDP, через которые будет передаваться resp.body.

Перед установкой resp.filters значение, которое считывается, будет списком фильтров по умолчанию, определённым Varnish на основе resp.do_esi и заголовков запроса.

После установки resp.filters изменение каких-либо условий, которые в противном случае определяют выбор фильтра, не повлияет. Использование resp.do_esi является ошибкой после установки resp.filters.

resp.http.*

Тип: ЗАГОЛОВОК

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

Неизменяемо из: vcl_deliver, vcl_synth

HTTP-заголовки, которые будут возвращены.

См. req.http для общих сведений.

resp.http.content-length

Тип: ЗАГОЛОВОК

Доступно из: vcl_deliver, vcl_synth

Поле заголовка content-length защищено, см. protected_headers.

resp.http.transfer-encoding

Тип: ЗАГОЛОВОК

Доступно из: vcl_deliver, vcl_synth

Поле заголовка transfer-encoding защищено, см. protected_headers.

resp.is_streaming

Тип: ЛОГИЧЕСКОЕ

Доступно из: vcl_deliver, vcl_synth

Возвращает true, когда ответ будет передаваться потоком при извлечении из бэкенда.

resp.proto VCL <= 4.0

Тип: СТРОКА

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

Версия протокола HTTP для использования в ответе.

resp.proto VCL >= 4.1

Тип: СТРОКА

Доступно из: vcl_deliver, vcl_synth

Версия протокола HTTP для использования в ответе.

resp.reason

Тип: СТРОКА

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

Сообщение состояния HTTP, которое будет возвращено.

resp.status

Тип: ЦЕЛОЕ

Доступно из: vcl_deliver, vcl_synth

Записывается из: vcl_deliver, vcl_synth

Код состояния HTTP, который будет возвращён.

Дополнительная информация в разделе HTTP-статус ответа.

resp.status 200 будет изменён на 304 кодом ядра после возврата (deliver) из vcl_deliver для условных запросов к кэшированному контенту, если проверка успешна.

Для проверки сначала req.http.If-None-Match сравнивается с resp.http.Etag. Если они равны в соответствии с правилами слабой проверки (см. RFC7232), отправляется 304.

Во-вторых, req.http.If-Modified-Since сравнивается с resp.http.Last-Modified или, если он не задан или слабый, со временем последнего изменения объекта на основе заголовков Date и Age, полученных с ответом бэкенда, который создал объект. Если объект не был изменён на основе этого сравнения, отправляется 304.

resp.time

Тип: ВРЕМЯ

Доступно из: vcl_deliver, vcl_synth

Время, когда мы начали подготовку ответа, сразу перед входом в vcl_synth {} или vcl_deliver {}.

Специальные переменные

now

Тип: ВРЕМЯ

Доступно из: всех

Текущее время в секундах с начала эпохи Unix.

При преобразовании в СТРОКУ в выражениях возвращает отформатированный временной отметки, например, Tue, 20 Feb 2018 09:30:31 GMT

now остаётся стабильным в течение всего времени работы любой встроенной подпрограммы VCL, чтобы сделать основанные на времени вычисления предсказуемыми и избежать крайних случаев.

Другими словами, даже если в VCL затрачивается значительное время, now всегда будет представлять момент времени, когда была вызвана соответствующая встроенная подпрограмма VCL. now не подходит для каких-либо измерений времени. См. VOID timestamp(STRING s), TIME now() и DURATION timed_call(SUB) в VMOD std - Varnish Standard Module.

sess

Сессия соответствует «диалогу», который Varnish ведёт с одним соединением клиента, через которое может происходить одна или несколько транзакций запрос/ответ. Она может включать трафик по HTTP/1 keep-alive соединению или мультиплексированный трафик по HTTP/2 соединению.

sess.idle_send_timeout

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: клиент

Записывается из: клиент

Таймаут отправки для отдельных фрагментов данных по соединениям клиентов, по умолчанию используется параметр idle_send_timeout, см. varnishd

sess.send_timeout

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: клиент

Записывается из: клиент

Общий таймаут для обычных HTTP1 ответов, по умолчанию используется параметр send_timeout, см. varnishd

sess.timeout_idle

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: клиент

Записывается из: клиент

Таймаут бездействия для этой сессии, по умолчанию используется параметр timeout_idle, см. varnishd

sess.timeout_linger

Тип: ПРОДОЛЖИТЕЛЬНОСТЬ

Доступно из: клиент

Записывается из: клиент

Таймаут ожидания для этой сессии, по умолчанию используется параметр timeout_linger, см. varnishd

sess.xid VCL >= 4.1

Тип: ЦЕЛОЕ

Доступно из: клиент, бэкенд

Уникальный идентификатор этой сессии.

storage

storage.<name>.free_space

Тип: БАЙТЫ

Доступно из: клиент, бэкенд

Доступное свободное место в указанном хранилище. Доступно только для хранилища malloc.

storage.<name>.happy

Тип: ЛОГИЧЕСКОЕ

Доступно из: клиент, бэкенд

Статус работоспособности указанного хранилища. Недоступно ни в одном из текущих хранилищ.

storage.<name>.used_space

Тип: БАЙТЫ

Доступно из: клиент, бэкенд

Занятое место в указанном хранилище. Доступно только для хранилища malloc.

Защищённые поля заголовков

Заголовки content-length и transfer-encoding являются только для чтения. Они должны быть сохранены, чтобы обеспечить согласованность кадрирования HTTP/1 и сохранить надлежащую синхронизацию запроса и ответа как с клиентами, так и с бэкендами.

VMOD по-прежнему может обновлять эти заголовки, когда есть причина изменить кадрирование, например, при преобразовании тела запроса или ответа.

Код состояния HTTP-ответа

Код состояния HTTP имеет 3 цифры XYZ, где X должен быть целым числом от 1 до 5 включительно. Поскольку нередко клиенты или серверы HTTP полагаются на нестандартные или даже некорректные коды состояния, Varnish может работать с любым кодом от 100 до 999.

В коде VCL даже можно использовать коды состояния в формате VWXYZ, если общее значение меньше 65536, но только часть XYZ будет отправлена клиенту, а к тому времени X должен стать ненулевым.

Формат кодов состояния VWXYZ может передавать дополнительную информацию в resp.status и beresp.status, чтобы указать, какой синтетический контент генерировать:

sub vcl_recv {
    if ([...]) {
        return synth(12404);
    }
}

sub vcl_synth {
    if (resp.status == 12404) {
        [...]       // this specific 404
    } else if (resp.status % 1000 == 404) {
        [...]       // all other 404's
    }
}

Переменная obj.status будет унаследовать формат VWXYZ, но в выражении запрета будет доступна только часть XYZ. Формат VWXYZ строго ограничен выполнением VCL.

Назначение стандартного кода HTTP для resp.status или beresp.status также установит resp.reason или beresp.reason соответствующее сообщение о состоянии.

Обработка 304

Для ответа 304 ядро Varnish изменяет beresp перед вызовом vcl_backend_response:

  • Если статус сжатия изменился, Content-Encoding сбрасывается, и любые Etag ослабляются
  • Любые заголовки, отсутствующие в ответе 304, копируются из существующего объекта кэша. Content-Length копируется, если присутствует в существующем объекте кэша, и отбрасывается в противном случае.
  • Состояние устанавливается в 200.

beresp.was_304 отмечает, что обработка условного ответа произошла.

Примечание: условные запросы к бэкенду независимы от условных запросов клиента, поэтому клиенты могут получать ответы 304 независимо от того, был ли запрос к бэкенду условным.

beresp.ttl / beresp.grace / beresp.keep

Перед вызовом vcl_backend_response ядро устанавливает beresp.ttl на основе кода состояния ответа и заголовков ответа Age, Cache-Control или Expires и Date следующим образом:

  • Если присутствует и корректен, значение заголовка Age фактически вычисляется из всех вычислений ttl.
  • Для кодов состояния 200, 203, 204, 300, 301, 304, 404, 410 и 414:

    • Если Cache-Control содержит поле s-maxage или max-age (в порядке предпочтения), ttl устанавливается на соответствующее неотрицательное значение или 0, если значение отрицательное.
    • В противном случае, если заголовок Expires не существует, используется значение ttl по умолчанию.
    • В противном случае, если Expires содержит отметку времени до Date, ttl устанавливается в 0.
    • В противном случае, если заголовок Date отсутствует или отметка времени заголовка Date отличается от локального времени не более чем на параметр clock_skew, ttl устанавливается в

      • 0, если Expires обозначает прошлую отметку времени, или
      • разницу между локальным временем и заголовком Expires в противном случае.
    • В противном случае, ttl устанавливается на разницу между Expires и Date
  • Для кодов состояния 302 и 307 вычисление идентично, за исключением того, что значение ttl по умолчанию не используется, и возвращается -1, если ни Cache-Control, ни Expires не существуют.
  • Для всех остальных кодов состояния возвращается ttl -1.

beresp.grace по умолчанию равен параметру default_grace.

Для неотрицательного ttl, если Cache-Control содержит значение поля stale-while-revalidate, beresp.grace устанавливается на это значение, если оно неотрицательно, или 0 в противном случае.

beresp.keep по умолчанию равен параметру default_keep.

СМОТРИТЕ ТАКЖЕ

  • varnishd
  • VCL

ИСТОРИЯ

VCL был разработан Poul-Henning Kamp в сотрудничестве с Verdens Gang AS, Redpill Linpro и Varnish Software. Эта страница руководства написана Per Buer, Poul-Henning Kamp, Martin Blix Grydeland, Kristian Lyngstøl, Lasse Karstensen и другими.

АВТОРСКИЕ ПРАВА

Данный документ лицензирован по той же лицензии, что и сам Varnish. Подробности см. в файле LICENSE.

  • Copyright (c) 2006 Verdens Gang AS
  • Copyright (c) 2006-2021 Varnish Software AS

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/reference/vcl-var.html

Spec-Zone.ru

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