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() с одним из следующих ключевых слов:
См. также
АВТОРСКИЕ ПРАВА
Этот документ лицензирован на тех же условиях, что и сам 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