
У меня есть этот код в конфигурации Varnish, и я не уверен, что он делает! Эта конфигурация будет кэшировать или нет мои клиентские запросы? Что с ней не так?
sub vcl_backend_response {
if (beresp.status != 200) {
return (pass);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.cookie;
unset beresp.http.Set-Cookie;
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.http.Cache-Control = "no-store";
}
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
return (pass);
}
return (deliver);
}
решение1
Этот блок кода VCL, похоже, определяет некоторые правила обхода кэша. Однако то, как он написан, не имеет особого смысла.
Обход кэша
return(pass)
не является правильным способом обхода кэширования в данном vcl_backend_response
контексте. return(pass)
используется, vcl_recv
когда входящий запрос обходит кэш.
В vcl_backend_response
обход кэша означает предотвращение сохранения входящего объекта в кэше. Лучшие практики диктуют, что вы делаете set beresp.uncacheable = true
, назначаете TTL и затем return(deliver)
. Это гарантирует, что этот объект обходит кэш в течение определенного времени, пока следующий ответ бэкенда не будет соответствовать требуемым критериям.
Включая его beresp.uncacheable
, вы гарантируете, что объект попадет в список ожидания и станет кандидатом на объединение запросов.
Удаление куки
Удаление куки часто имеет смысл для улучшения вашего показателя попаданий. В контексте бэкэнда вы удалите заголовок Set-Cookie
. Это правильно сделано в vcl_backend_response
через unset beresp.http.Set-Cookie
, однако это делается безусловно.
Это означает, что никаких Set-Cookie
действий не будет, что может привести к непоследовательному поведению. Не уверен, требуются ли предварительные условия для удаления этих файлов cookie.
Вы также можете удалить входящие куки через unset req.http.Cookie
. Но, похоже, есть похожий вызов, vcl_backend_response
который запускается unset beresp.http.Cookie
.
Это означало бы, что Cookie
будет получен заголовок ответа. Это кажется маловероятным.
Переписывание VCL
Вот как бы я переписал этот код VCL без какого-либо другого контекста:
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
unset req.http.Cookie;
}
sub vcl_backend_response {
if(beresp.status != 200) {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.Set-Cookie;
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
return (deliver);
}
Предупреждение: Я бы не рекомендовал копировать/вставлять это в вашу производственную среду. У меня такое чувство, что при написании этого VCL были срезаны некоторые углы. Поскольку у меня нет дополнительного контекста, я не хочу советовать использовать это.