我使用以下代码清除网站的主页:
$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: 15
和 X-Cache: HIT
都已设置,这表明页面仍处于缓存状态并且存在 15 秒。
TTL 为 120。
我错过了什么吗?
谢谢杰克
为了消除所有其他php/curl问题,我将从最基本的低级检查开始。
这对我有用:
netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname
EOF
- 将varnish_hostname替换为实际的清漆主机名。
- 将 80 替换为实际端口清漆侦听。
- 将/the/url 替换为要清除的 url 的路径部分
- 将主机名替换为要清除的 URL 中的主机名部分。
一旦你开始工作,你就知道你的VCL规则和ACL不是问题,你可以进入curl/php级别。
编辑两个注释:
- 您可能需要快速键入上述内容以防止连接过早关闭,因为现在许多 HTTP 堆栈不允许在连接建立和 HTTP 请求之间出现长时间延迟,以防止半开放 DoS 攻击。 您可以通过提前准备整个输入,将其复制到粘贴缓冲区,然后单击鼠标粘贴整个简介来实现此目的。
- HTTP 请求标头必须以双换行符结尾,如上所示。
netcat -C
选项用于根据 HTTP 协议将换行符转换为 CRLF 字符对。
我想你不会在默认中检查清除.vcldefault.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 地址阻止您的 PPURGE,或者可能无法实施。
只是要知道,PURGE 适用于 beReq。
如果修改 req.url(即向 URI 添加前缀或后缀),则应在调用 purge 的vcl_recv中执行相同的操作。或者,您必须在 url 操作后将清除条件写入主vcl_recv内。