Я новичок в работе с лаком. Установил, думаю правильно настроил. Чтобы проверить, что я сделал:
Я создал тестовую страницу, на которой есть только строка «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.