4

我正在使用以下代码清除网站的主页:

$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

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

TTL 为 120。

我错过了什么吗?

谢谢杰克

4

4 回答 4

5

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

这对我有用:

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

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

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

编辑两个注意事项:

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

我认为您不会检查 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";
        }
}
于 2012-08-21T15:15:31.990 回答
1

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

PURGE 在您的 vcl 文件中实现(或者至少应该在您希望它工作的情况下实现),并且它的作用和不存在于代码中。它可能会根据您连接的 IP 地址阻止您的 PURGE,或者它可能未实施。

于 2012-08-18T05:31:54.557 回答
1

只是要知道,PURGE 适用于 beReq。

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

于 2015-11-28T13:53:39.167 回答