![Varnish 4 不缓存](https://linux22.com/image/658126/Varnish%204%20%E4%B8%8D%E7%BC%93%E5%AD%98.png)
我是 varnish 的新手。我安装了它,我认为我配置正确。为了测试,我做了以下操作:
我创建了一个仅包含字符串“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”。如果缓存正确,我相信应该显示“test”。
我没有设置 cookies 或任何其他东西,仅此而已。我的 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.
}
有什么想法吗?谢谢
答案1
很有可能在您的请求中发送了 cookie。Varnish 不会缓存任何带有 cookie 的内容。这来自Varnish 4 的builtin.vcl:
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 }
您需要在 VCL 中删除不需要的 cookie,如下所示此示例来自 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,并且如果您在一秒多之后重复该操作,您应该会获得大于 0 的 Age 标头。
答案2
我不确定您是否正确设置了宽限模式。清漆书似乎表明您应该设置其中一些,vcl_fetch
也许vcl_recv
。
(我不熟悉 Varnish,但我希望很快就能熟悉)。
核心宽限机制
宽限对象是已过期但仍保留在缓存中的对象 宽限模式是当 Varnish 使用宽限对象时 Varnish 有多种使用宽限对象的方式。 req.grace 定义对象可以过期多长时间以使 Varnish 仍将其视为宽限模式。 beresp.grace 定义 Varnish 将保留对象超过 beresp.ttl 时间多长时间 req.grace 通常会根据后端的状态在 vcl_recv 中修改。当 Varnish 处于宽限模式时,它会使用就 TTL 而言已经过期的对象。发生这种情况的原因有多种,其中之一是后端被健康探测标记为不良。为了使 Varnish 能够使用宽限对象,需要发生两件事:
对象仍需保留。这受 vcl_fetch 中的 beresp.grace 影响。VCL 必须允许 Varnish 使用与保留的对象一样过期的对象。这受 vcl_recv 中的 req.grace 影响。设置宽限时,您需要修改 vcl_recv 和 vcl_fetch 才能有效使用宽限。使用宽限的典型方法是将对象存储超过其 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; }
答案3
检查 Apache 向 Varnish 发送了哪些标头。您还可以在 Varnish 中明确设置内容的 TTL。
答案4
您可以尝试将 ttl 值增加到 beresp.ttl = 30m;我认为 varnish 的默认 ttl 值为 120 秒。
Age:标题的值是否会在每次点击时增加?