Spec-Zone.ru › Varnish

VCL-шаги

Встроенные подпрограммы

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

7

ОПИСАНИЕ

Различные встроенные подпрограммы вызываются во время обработки запросов клиента и бэкенда, а также при vcl.load и vcl.discard.

См. Состояния обработки Varnish для подробного графического обзора состояний и их связи с основными функциями кода и подпрограммами VCL.

Встроенные подпрограммы всегда завершаются с return (<action>), где <action> определяет, как продолжается обработка в состоянии обработки запроса.

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

Общие действия документированы в Действия VCL в следующем разделе. Действия, специфичные только для одной или нескольких подпрограмм, документированы в Шаги VCL.

По умолчанию поведение для всех Состояний обработки Varnish задано в коде Встроенный VCL.

Действия VCL

Действия используются с ключевым словом return(<action>), которое возвращает управление от подпрограмм обратно к varnish. Действие определяет, как продолжается обработка в varnish, как показано в Состояниях обработки Varnish.

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

Общие действия для стороны клиента и бэкенда

fail

Переход к vcl_synth на стороне клиента, как и для return(synth(503, "VCL Failed")), но с любыми изменениями состояния запроса, отменёнными так, как если бы вызывался std.rollback() и принудительно закрывается соединение.

Предназначено для фатальных ошибок, для которых возможна только минимальная обработка ошибок.

Общие действия для стороны клиента

synth(status code, reason)

Переход к vcl_synth с resp.status и resp.reason заданными в качестве аргументов synth().

pass

Переключение в режим пропуска, делая текущий запрос не использующим кеш и не помещая его ответ в него. Управление в конечном итоге передается vcl_pass.

pipe

Переключение в режим передачи. Управление в конечном итоге передается vcl_pipe.

restart

Перезапуск транзакции. Увеличивает счётчик req.restarts.

Если количество перезапусков превышает параметр max_restarts, управление передаётся vcl_synth, как и для return(synth(503, "Too many restarts")).

При перезапуске сохраняются все изменения атрибутов req, за исключением req.restarts и req.xid, которые по своему предназначению должны измениться.

Общие действия для стороны бэкенда

abandon

Отказ от запроса бэкенда. Если запрос бэкенда не был фоновым запросом, управление передаётся vcl_synth на стороне клиента с resp.status, установленным в 503.

Шаги VCL

Клиентская сторона

vcl_recv

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

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

Подпрограмма vcl_recv может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_pipe

Вызывается при входе в режим передачи. В этом режиме запрос передается бэкенду, а любые последующие данные как от клиента, так и от бэкенда передаются без изменений до тех пор, пока не закроется соединение с одной из сторон. По сути, Varnish перейдет в простой прокси-сервер TCP, пересылая байты туда и обратно. Для соединения в режиме передачи никакая другая подпрограмма VCL не будет вызвана после vcl_pipe.

Подпрограмма vcl_pipe может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_pass

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

Подпрограмма vcl_pass может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_hash

Вызывается после vcl_recv для создания значения хэша для запроса. Оно используется в качестве ключа для поиска объекта в Varnish.

Подпрограмма vcl_hash может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_purge

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

Подпрограмма vcl_purge может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_miss

Вызывается после поиска в кэше, если запрашиваемый документ не найден в кэше или если vcl_hit вернуло fetch.

Его цель — определить, следует ли пытаться получить документ из бэкенда. Подсказка для бэкенда может быть установлена по умолчанию для стороны обработки бэкенда.

Подпрограмма vcl_miss может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_hit

Вызывается при успешном поиске в кэше. Попадающий в кэш объект может быть устаревшим: у него может быть ноль или отрицательное значение ttl со временем действия только grace или keep.

Подпрограмма vcl_hit может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_deliver

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

Подпрограмма vcl_deliver может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_synth

Вызывается для передачи синтетического объекта. Синтетический объект генерируется в VCL, а не извлекается из бэкенда. Его тело может быть построено с помощью функции synthetic().

Объект, определенный с помощью vcl_synth, никогда не попадает в кэш, в отличие от объекта, определенного с помощью vcl_backend_error, который может попасть в кэш.

Подпрограмма может завершиться вызовом return() с одним из следующих ключевых слов:

Сторона бэкенда

vcl_backend_fetch

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

Подпрограмма vcl_backend_fetch может завершиться вызовом return() с одним из следующих ключевых слов:

Перед вызовом vcl_backend_fetch, ядро Varnish готовит запрос бэкенда bereq следующим образом:

  • Если запрос не является pass,

    • установите bereq.method в GET и bereq.proto в HTTP/1.1 и
    • установите bereq.http.Accept_Encoding в gzip если включена http_gzip_support.
  • Если есть существующий объект кэша, который нужно перепроверить, установите bereq.http.If-Modified-Since из его заголовка Last-Modified и/или установите bereq.http.If-None-Match из его заголовка Etag
  • Установите bereq.http.X-Varnish в текущий идентификатор транзакции (vxid)

Эти изменения можно отменить или изменить в vcl_backend_fetch перед отправкой запроса бэкенду.

В частности, для кеширования запросов, отличных от GET, необходимо сохранить req.method в заголовок или переменную в vcl_recv и восстановить в bereq.method. Обратите внимание, что кеширование запросов, отличных от GET, обычно также требует изменения ключа кэша в vcl_hash, например, также хешируя метод запроса и/или тело запроса.

Запрос HEAD может быть удовлетворен из кэшированных ответов GET.

vcl_backend_response

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

Подпрограмма vcl_backend_response может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_backend_error

Эта подпрограмма вызывается, если произошла ошибка при обращении к бэкенду или если предел max_retries был превышен.

Возврат с abandon не приводит к созданию объекта кэша.

Если возвращаться с deliver и beresp.ttl > 0s, в VCL генерируется синтетический объект кэша, тело которого может быть построено с помощью функции synthetic().

Если в очереди есть ожидающие объекты, значение ttl по умолчанию будет положительным (в настоящее время одна секунда), устанавливаемое перед входом в vcl_backend_error. Это позволяет избежать сериализации запросов и чрезмерной нагрузки на потенциально неисправный бэкенд.

Так как эти синтетические объекты кешируются в этих особых случаях, будьте осторожны при размещении там конфиденциальной информации. Если это необходимо, установите beresp.ttl в ноль в vcl_backend_error.

Подпрограмма vcl_backend_error может завершиться вызовом return() с одним из следующих ключевых слов:

Во время vcl.load / vcl.discard

vcl_init

Вызывается при загрузке VCL перед тем, как любые запросы пройдут через него. Обычно используется для инициализации VMOD.

Подпрограмма vcl_init может завершиться вызовом return() с одним из следующих ключевых слов:

vcl_fini

Вызывается при удалении VCL только после того, как все запросы выйдут из VCL. Обычно используется для очистки VMOD.

Подпрограмма vcl_fini может завершиться вызовом return() с одним из следующих ключевых слов:

См. также

  • varnishd
  • VCL

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

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

  • Авторские права (c) 2006 Verdens Gang AS
  • Авторские права (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-step.html

Spec-Zone.ru

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