Varnish 5,如果后端关闭,则提供缓存对象

时间:2018-02-06 18:34:24

标签: varnish

我正在使用清漆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

1 个答案:

答案 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