升级清漆配置。 obj.ttl 和 vcl_hit 中的 beresp.ttl 不工作
Upgrading varnish config. obj.ttl and beresp.ttl in vcl_hit aren't working
我一直在关注有关设置 haproxy 和清漆的教程。 (Link) 然而,该教程是几年前写的。我一直在尝试更改 V3 varnish 配置,但在这部分遇到了问题:
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);
}
}
"purge part" 只应在 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() 不再位于 Varnish 4 的 PURGE 代码路径上。我一直成功地将它与 Varnish 3 一起使用来报告缓存失效。我问 Varnish Software 的人为什么要删除它,他们只是说它不准确,因为缓存中的对象可能有不同的变体。我不同意他们的决定,因为它仍然有助于验证您想要清除的变体实际上是否已被清除。
在提供的另一个答案中,我将删除 vcl_hit() 和 vcl_miss() 并使用默认处理程序 运行,因为您没有添加任何附加条件。
我一直在关注有关设置 haproxy 和清漆的教程。 (Link) 然而,该教程是几年前写的。我一直在尝试更改 V3 varnish 配置,但在这部分遇到了问题:
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);
}
}
"purge part" 只应在 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() 不再位于 Varnish 4 的 PURGE 代码路径上。我一直成功地将它与 Varnish 3 一起使用来报告缓存失效。我问 Varnish Software 的人为什么要删除它,他们只是说它不准确,因为缓存中的对象可能有不同的变体。我不同意他们的决定,因为它仍然有助于验证您想要清除的变体实际上是否已被清除。
在提供的另一个答案中,我将删除 vcl_hit() 和 vcl_miss() 并使用默认处理程序 运行,因为您没有添加任何附加条件。