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

Varnish 4 не кешируется

Я новичок в работе с лаком. Установил, думаю правильно настроил. Чтобы проверить, что я сделал:

Я создал тестовую страницу, на которой есть только строка «test». Я перешел на страницу, и на ней есть следующие заголовки:

Accept-Ranges:bytes
Age:0
Cache-Control:max-age=120
Connection:keep-alive
Content-Length:6
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 May 2015 19:35:34 GMT
Expires:Tue, 12 May 2015 19:37:34 GMT
Server:Apache/2.2.15 (CentOS)
Via:1.1 varnish-v4
X-Powered-By:PHP/5.3.3
X-Varnish:32829

Я меняю текст в файле на «test2». Я перехожу на страницу, и там отображается «test2». Я считаю, что он должен показывать "тест", правильно ли он кэшировал.

У меня нет файлов cookie или чего-то еще, просто так. Мой vcl очень прост:

vcl 4.0;

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.


    #This will set up "grace mode".
    set beresp.ttl = 10s;
    set beresp.grace = 1h;


}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}

Любая идея? Спасибо

Скорее всего, в вашем запросе отправляются файлы cookie. Varnish ничего не кеширует, если в них есть куки. Это из builtin.vcl для Varnish 4:

47  sub vcl_recv {
48        if (req.method == "PRI") {
49            /* We do not support SPDY or HTTP/2.0 */
50            return (synth(405));
51        }
52        if (req.method != "GET" &&
53          req.method != "HEAD" &&
54          req.method != "PUT" &&
55          req.method != "POST" &&
56          req.method != "TRACE" &&
57          req.method != "OPTIONS" &&
58          req.method != "DELETE") {
59            /* Non-RFC2616 or CONNECT which is weird. */
60            return (pipe);
61        }
62    
63        if (req.method != "GET" && req.method != "HEAD") {
64            /* We only deal with GET and HEAD by default */
65            return (pass);
66        }
67        if (req.http.Authorization || req.http.Cookie) {
68            /* Not cacheable by default */
69            return (pass);
70        }
71        return (hash);
72    }

Вам необходимо удалить нежелательные файлы cookie в VCL, как показано на этот пример с сайта Varnish

Удаление Set-Cookie из бэкэнда (для определенного пути)

В этом случае мы удаляем как заголовок Cookie, так и заголовок Set-Cookie для объектов по предопределенному пути. Это довольно распространено для изображений и подобного статического содержимого.

sub vcl_recv {
    if (req.url ~ "^/images") {
        unset req.http.cookie;
    }
}

sub vcl_backend_response {
    if (req.url ~ "^/images") {
        unset beresp.http.set-cookie;
    }
}

Если вы проверите с curl -i URL, вы не будете отправлять файлы cookie, и если вы повторите это более чем через секунду, вы должны получить заголовок Age больше 0.

Я не уверен, что вы правильно настроили льготный режим. Лаковая книга похоже, указывает на то, что вы должны установить некоторые из них в vcl_fetch и, возможно vcl_recv.

(Я не знаком с Varnish, но надеюсь скоро буду).

Основные механизмы льгот

Украшенный объект - это объект, срок действия которого истек, но он все еще хранится в кэше. Режим льготного режима - это когда Varnish использует украшенный объект. Есть несколько способов, которыми Varnish может в конечном итоге использовать украшенный объект. req.grace определяет, как долго может быть просрочен объект, чтобы Varnish по-прежнему считал его для режима отсрочки. beresp.grace определяет, как долго после того, как beresp.ttl-time Varnish будет хранить объект, req.grace часто изменяется в vcl_recv в зависимости от состояния серверной части. Когда Varnish находится в льготном режиме, он использует объект, срок действия которого уже истек, что касается TTL. Это может произойти по нескольким причинам, одна из которых заключается в том, что серверная часть помечена проверкой работоспособности как плохая. Чтобы Varnish мог использовать украшенный объект, должны произойти две вещи:

Объект нужно держать под рукой. На это влияет beresp.grace в vcl_fetch. VCL должен позволить Varnish использовать такой же просроченный объект, как и тот, который хранится. На это влияет req.grace в vcl_recv. При настройке льготного режима вам нужно будет изменить как vcl_recv, так и vcl_fetch, чтобы эффективно использовать льготный режим. Типичный способ использования Grace - хранить объект в течение нескольких часов после его TTL, но использовать его только через несколько секунд после TTL, за исключением случаев, когда серверная часть не работает. Мы рассмотрим больше проверок работоспособности через мгновение, а пока следующая VCL может иллюстрировать обычную настройку:

sub vcl_recv {
        if (req.backend.healthy) {
                set req.grace = 30s;
        } else {
                set req.grace = 24h;
        }
}

sub vcl_fetch {
        set beresp.grace = 24h;
}

Вы можете попробовать увеличить значение ttl до beresp.ttl = 30m; Я думаю, что у varnish есть значение ttl по умолчанию 120 секунд.

Увеличивается ли значение заголовка Age: при каждом следующем попадании?

Проверьте, какие заголовки отправляются в Varnish Apache. Вы также можете явно установить TTL содержимого в Varnish.