Назад | Перейти на главную страницу

Как динамически установить TTL отклика на лак?

мой php скрипт отправляет заголовок X_Cache_ttl: 1h и в моем файле конфигурации лака у меня есть

sub vcl_fetch
{
    if(beresp.http.X-Cache-ttl){
            set beresp.ttl = beresp.http.X-Cache-ttl;
    }
}

но строка с командой set вызывает сбой varnish, когда я пытаюсь запустить его.

в журнале я получаю

Expression has type STRING, expected DURATION
('input' Line 116 Pos 34) -- ('input' Line 116 Pos 56)
            set beresp.ttl = beresp.http.X-Cache-ttl;

Как мне конвертировать X-Cache-ttl до продолжительности, чтобы я мог динамически устанавливать TTL?

Я бы хотел избежать нескольких операторов if, похожих на

if(beresp.http.X-Cache-ttl == "60s") {
    set beresp.ttl = 60s;
}

if(beresp.http.X-Cache-ttl == "1h") {
    set beresp.ttl = 1h;
}

Если это важно, я использую лак 3.0.3 на centos 6.

В vmod_std В модуле есть функция, которая должна делать то, что вы ищете.

import std; в верхней части VCL, тогда это должно работать:

sub vcl_fetch
{
    set beresp.ttl = std.duration(beresp.http.X-Cache-ttl, 1h);
}

..где 1h используется по умолчанию, если заголовок не установлен.

Согласно документации Varnish вы можете использовать Cache-Control заголовок.

Кэш-контроль

Заголовок «Cache-Control» указывает кешам, как обрабатывать контент. Varnish заботится о параметре max-age и использует его для вычисления TTL для объекта.

Поэтому убедитесь, что вы используете заголовок Cache-Control с заголовком max-age. Вы можете посмотреть, с чем работает сервер Drupal Varnish Software:

$ GET -Used http://www.varnish-software.com/|grep ^Cache-Control
Cache-Control: public, max-age=600

https://github.com/varnishcache/varnish-cache/blob/master/doc/sphinx/users-guide/increasing-your-hitrate.rst