Встроенный VCL
Всякий раз, когда загружается программа VCL, встроенный VCL добавляется к ней. Подпрограммы встроенного vcl (Шаги VCL) обладают особым свойством — они могут появляться несколько раз, и результатом является конкатенация всех встроенных подпрограмм.
Например, рассмотрим следующий фрагмент:
sub vcl_recv {
# loaded code for vcl_recv
}
Эффективный VCL, который предоставляется компилятору, выглядит следующим образом:
sub vcl_recv {
# loaded code for vcl_recv
# built-in code for vcl_recv
}
Таким образом гарантируется, что все Состояния обработки Varnish имеют как минимум одну return (<action>).
В целом рекомендуется не возвращаться неизменно из загруженного кода, чтобы позволить Varnish выполнить встроенный код, поскольку встроенный код предоставляет по существу разумное поведение по умолчанию для кэша HTTP.
Разделение встроенных подпрограмм
Тем не менее, не всегда практично, чтобы встроенные правила VCL вступали в силу в самом конце состояния, поэтому некоторые подпрограммы, такие как vcl_recv , разбиваются на несколько вызовов других подпрограмм.
По соглашению, эти вспомогательные подпрограммы называются по имени переменной, с которой они работают, например, req или beresp. Это позволяет, например, обойти поведение по умолчанию.
Например, vcl_recv во встроенном VCL предотвращает кэширование, когда у клиентов есть cookie. Если вы можете доверять своему бэкенду, что он всегда будет указывать, кэшируемый ли ответ или нет независимо от того, содержал ли запрос cookie, вы можете сделать это:
sub vcl_req_cookie {
return;
}
Благодаря этому все другие правила по умолчанию от встроенного vcl_recv выполняются, и только обработка cookie затронута.
Еще один пример — то, как встроенный vcl_backend_response обрабатывает отрицательное значение TTL как сигнал о том, что кэширование не должно выполняться. Это исторический механизм для маркировки ответа как некэшируемого, но только если встроенный vcl_backend_response не обойден return (<action>).
Однако в многоуровневой архитектуре, где бэкенд может быть другим сервером Varnish, вы можете кэшировать устаревшие ответы, чтобы позволить доставку обработанных объектов и включить повторную проверку при следующем запросе. Это можно сделать с помощью следующего фрагмента:
sub vcl_beresp_stale {
if (beresp.ttl + beresp.grace > 0s) {
return;
}
}
Эта детализация и общая цель разделения встроенных подпрограмм — позволить обойти определенный аспект правил по умолчанию, не отказываясь от всей логики.
Ссылка на встроенный VCL
Копия файла builtin.vcl может быть предоставлена вместе с установкой Varnish, но varnishd — это ссылка для определения кода, который добавляется к любому загруженному VCL.
Компиляция VCL происходит в два этапа:
- на первом этапе компилируется только встроенный VCL,
- а на втором этапе компилируется конкатенация загруженного и встроенного VCL.
Любая подпрограмма VCL, присутствующая во встроенном VCL, может быть расширена, в этом случае код загруженного VCL будет выполнен до встроенного кода.
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/vcl-built-in-code.html