我一直在关注设置haproxy和varnish的教程。 (Link)但是,该教程是在几年前编写的。我一直试图更改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
有人可以建议解决方案吗?
以下是我在varnish配置中改变的内容:
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);
}
}
答案 0 :(得分:4)
"清除部分"应仅在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);
}
答案 1 :(得分:1)
在提供的另一个答案中,我将删除vcl_hit()和vcl_miss()并让默认处理程序运行,因为您没有添加任何其他条件。