Обновление конфига лака. obj.ttl и beresp.ttl в vcl_hit не работают
Я следовал учебному пособию по настройке haproxy и лака. ( Ссылка) Однако учебник был написан много лет назад. Я пытался изменить конфигурацию лака V3 и столкнулся с проблемой в этой части:
sub vcl_hit {
# Purge
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
return (deliver);
}
set obj.ttl = 0s;
устарел. Это выдает эту ошибку при запуске сервиса:
Stopping Varnish Cache: [FAILED]
Starting Varnish Cache: Error:
Variable 'obj.ttl' is read only.
At: ('input' Line 46 Pos 21)
Кто-то сказал beresp.ttl
следует использовать вместо этого, но это не поддерживается в методе vcl_hit
:
Message from VCC-compiler:
'beresp.ttl': cannot be set in method 'vcl_hit'.
At: ('input' Line 95 Pos 21)
set beresp.ttl = 0s;
--------------------##########-------
Running VCC-compiler failed, exited with 2
VCL compilation failed
Кто-нибудь может предложить решение для этого?
Вот что я изменил в конфигурации лака:
vcl 4.0;
backend apache2_static {
.host = "127.0.0.1";
.port = "3001";
.connect_timeout = 3s;
.first_byte_timeout = 10s;
.between_bytes_timeout = 5s;
.probe = {
.url = "/haproxycheck";
.expected_response = 200;
.timeout = 1s;
.interval = 3s;
.window = 2;
.threshold = 2;
.initial = 2;
}
}
acl purge {
"localhost";
}
sub vcl_recv {
### Default options
# Health Checking
if (req.url == "/varnishcheck") {
return (synth(751, "health check OK!"));
}
# Set default backend
set req.backend_hint = apache2_static;
# grace period (stale content delivery while revalidating)
#
# This is now handled in vcl_hit.
#
# set req.grace = 30s;
# Purge request
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "Not allowed."));
}
return (hash);
}
# Accept-Encoding header clean-up
if (req.http.Accept-Encoding) {
# use gzip when possible, otherwise use deflate
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unknown algorithm, remove accept-encoding header
unset req.http.Accept-Encoding;
}
# Microsoft Internet Explorer 6 is well know to be buggy with compression and css / js
if (req.url ~ ".(css|js)" && req.http.User-Agent ~ "MSIE 6") {
unset req.http.Accept-Encoding;
}
}
### Per host/application configuration
# apache2_static
# Stale content delivery
# Cookie ignored in these static pages
unset req.http.cookie;
### Common options
# Static objects are first looked up in the cache
if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
return (hash);
}
# if we arrive here, we look for the object in the cache
return (hash);
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
sub vcl_hit {
# Purge
if (req.method == "PURGE") {
set obj.ttl = 0s;
return (synth(200, "Purged."));
}
return (deliver);
}
sub vcl_miss {
# Purge
if (req.method == "PURGE") {
return (synth(404, "Not in cache."));
}
return (fetch);
}
sub vcl_backend_response {
# Stale content delivery
set beresp.grace = 1d;
# Hide Server information
unset beresp.http.Server;
# Store compressed objects in memory
# They would be uncompressed on the fly by Varnish if the client doesn't support compression
if (beresp.http.content-type ~ "(text|application)") {
set beresp.do_gzip = true;
}
# remove any cookie on static or pseudo-static objects
unset beresp.http.set-cookie;
return (deliver);
}
sub vcl_deliver {
unset resp.http.via;
unset resp.http.x-varnish;
# could be useful to know if the object was in cache or not
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
return (deliver);
}
sub vcl_backend_error {
# Health check
if (beresp.status == 751) {
set beresp.status = 200;
return (deliver);
}
}
sub vcl_synth {
# Health check
if (resp.status == 751) {
set resp.status = 200;
return (deliver);
}
}
2 ответа
"Часть продувки" должна быть только в vcl_recv
и удален из vcl_hit
& vcl_miss
,
Вы также должны изменить его в vcl_recv
,
sub vcl_recv {
### Default options
# Health Checking
if (req.url == "/varnishcheck") {
return (synth(751, "health check OK!"));
}
# Set default backend
set req.backend_hint = apache2_static;
# grace period (stale content delivery while revalidating)
#
# This is now handled in vcl_hit.
#
# set req.grace = 30s;
# Purge request
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "Not allowed."));
}
return (purge);
}
# Accept-Encoding header clean-up
if (req.http.Accept-Encoding) {
# use gzip when possible, otherwise use deflate
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unknown algorithm, remove accept-encoding header
unset req.http.Accept-Encoding;
}
# Microsoft Internet Explorer 6 is well know to be buggy with compression and css / js
if (req.url ~ ".(css|js)" && req.http.User-Agent ~ "MSIE 6") {
unset req.http.Accept-Encoding;
}
}
### Per host/application configuration
# apache2_static
# Stale content delivery
# Cookie ignored in these static pages
unset req.http.cookie;
### Common options
# Static objects are first looked up in the cache
if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
return (hash);
}
# if we arrive here, we look for the object in the cache
return (hash);
}
vcl_hit
метод
sub vcl_hit {
return (deliver);
}
vcl_miss
метод
sub vcl_miss {
return (fetch);
}
vcl_hit() и vcl_miss(), к сожалению, больше не находятся в пути кода PURGE для Varnish 4. Я всегда успешно использовал его с Varnish 3 для сообщения о недействительности кэша. Я спросил сотрудников Varnish Software, почему он был удален, и они только сказали, что он не точный, потому что у вас могут быть разные варианты для obj в кеше. Я не согласен с их решением, так как было бы полезно проверить, что вариант, который вы хотите очистить, действительно был очищен.
В другом ответе я просто удалил vcl_hit() и vcl_miss() и позволил запустить обработчик по умолчанию, так как вы не добавляете никаких дополнительных условий.