我正在使用清漆5.2.1。 我已经为宽限模式配置了VCL。如果TTL过期,如果后端关闭,则对象进入宽限模式。没关系。 但是,如果我禁止或清除对象,这不起作用。 如果我清除或禁用,并且后端关闭,清漆显示503错误而不是保存在恩典中的对象。
如果用户禁止或清除对象,您可以帮助使用宽限模式吗?
我已使用文章https://www.getpagespeed.com/server-setup/varnish/varnish-5-2-grace-mode
在清漆5.2中实现了宽限模式和软清除一切都很好,但是,例如,如果我使用wordpress与Varnish HTTP Purge插件(https://it.wordpress.org/plugins/varnish-http-purge/),当我清除特定的url / article时,一切正常,但是如果我请求清除整个缓存,工作
我认为问题是beacuse请求是一个正则表达式... for url“/.*"
在varnishlog上,我看到了这个请求:
<< Request >> 163874
Begin req 163873 rxreq
Timestamp Start: 1517991657.640832 0.000000 0.000000
Timestamp Req: 1517991657.640832 0.000000 0.000000
ReqStart 10.0.1.100 37454
ReqMethod PURGE
ReqURL /.*
ReqProtocol HTTP/1.1
ReqHeader host: test.local
ReqHeader User-Agent: WordPress/4.9.4; http://test.local
ReqHeader Accept: /
ReqHeader Accept-Encoding: deflate, gzip
ReqHeader Referer: http://10.0.3.250/.*
ReqHeader X-Purge-Method: regex
ReqHeader Connection: close
ReqHeader X-Forwarded-For: 10.0.1.100
VCL_call RECV
VCL_acl MATCH purge_acl "10.0.1.100"
VCL_return hash
ReqUnset Accept-Encoding: deflate, gzip
ReqHeader Accept-Encoding: gzip
VCL_call HASH
VCL_return lookup
VCL_call MISS
ReqHeader purged: 0
VCL_return synth
Timestamp Process: 1517991657.640916 0.000084 0.000084
RespHeader Date: Wed, 07 Feb 2018 08:20:57 GMT
RespHeader Server: Varnish
RespHeader X-Varnish: 163874
RespProtocol HTTP/1.1
RespStatus 404
RespReason Not Found
RespReason Not Found
VCL_call SYNTH
RespHeader purged: 0
VCL_return deliver
RespHeader Content-Length: 0
Storage malloc Transient
RespHeader Connection: close
Timestamp Resp: 1517991657.641034 0.000201 0.000118
ReqAcct 206 0 206 148 0 148
End
答案 0 :(得分:0)
如果你使用BAN
(因为它们被立即释放),没有解决方案来保持graced对象,但对于PURGE
你可以使用软清除功能(这会将对象保留在缓存中)尽管将TTL设置为0)。
Varnish 5.2附带吹扫模块用于此目的(硬清洗和软清洗)。 所以你需要在你的VCL中实现它:
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip !~ purge_acl) {
return (synth(405));
}
return (hash);
}
}
sub my_purge {
set req.http.purged = purge.soft();
if (req.http.purged == "0") {
return (synth(404));
}
else {
return (synth(200));
}
}
sub vcl_hit {
if (req.method == "PURGE") {
call my_purge;
}
}
sub vcl_miss {
if (req.method == "PURGE") {
call my_purge;
}
}
sub vcl_synth {
if (req.method == "PURGE") {
if (req.http.purged) {
set resp.http.purged = req.http.purged;
}
return (deliver);
}
}
可在此处找到更多信息:Implementing grace mode in Varnish 5.2。