繁体   English   中英

PURGE在Varnish缓存中失败

[英]PURGE fails in Varnish cache

我使用以下代码来清理网站的主页:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com:8080/");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);

$r = curl_exec($ch);

echo "<PRE>$r</PRE>";

curl_close($ch);

Varnish的回应如预期:

HTTP/1.1 200 Purged.
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 382
Accept-Ranges: bytes
Date: Fri, 10 Aug 2012 10:50:56 GMT
X-Varnish: 617777456
Age: 0
Via: 1.1 varnish
Connection: close
X-Cache: MISS

所以现在我认为它已被清除,但是进一步调用页面检查标题表明它没有被清除。 由于Age: 15X-Cache: HIT都已设置,表明该页面仍然被缓存并且是15秒。

TTL是120。

我错过了什么吗?

谢谢杰克

为了消除所有其他php / curl问题,我将从最基本的低级检查开始。

这对我有用:

netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname

EOF
  • 用您的实际varnish主机名替换varnish_hostname。
  • 用实际的端口清漆监听替换80
  • url的路径部分替换为/ url以进行清除
  • 主机名替换为要清除的URL中的主机名部分。

一旦你开始工作,你知道你的VCL规则和ACL不是问题,你可以进入curl / php级别。

编辑两个说明:

  1. 您可能必须快速键入以上内容以防止连接过早关闭,因为现在许多http堆栈不允许在连接建立和HTTP请求之间存在长时间延迟以防止半开DoS攻击。 您可以通过提前准备整个输入,将其复制到粘贴缓冲区,并通过单击鼠标粘贴整个blurb来实现此目的。
  2. HTTP请求标头必须以双新行结束,如上所示。 netcat -C选项用于根据HTTP协议将换行符转换为CRLF字符对。

我认为你不会检查default.vcl中的清除default.vcl应该包含如下内容:

acl purge {
        "localhost";
        "192.168.55.0"/24;
}

sub vcl_recv {
        # allow PURGE from localhost and 192.168.55...

        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return (lookup);
        }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                error 200 "OK but nothing to purge - URL was not in cache";
        }
}

我想评论你应该发布你的default.vcl文件,但我的声誉太低了。

PURGE是在您的vcl文件中实现的(或者至少应该如果您希望它能够工作),以及它在代码中的作用和不作用。 它可能会根据您连接的IP地址阻止您的PURGE,或者可能无法实现。

要知道,PURGE在beReq上工作。

如果修改req.url(即为URI添加前缀或后缀),则应在调用purge的vcl_recv中执行相同操作。 或者,您必须在url操作在主vcl_recv中写入清除条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM