PURGE 在 Varnish 缓存中失败

Jak*_*e N 4 php caching varnish

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

$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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

TTL 为 120。

我错过了什么吗?

谢谢杰克

ari*_*elf 5

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

这对我有用:

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

EOF
Run Code Online (Sandbox Code Playgroud)
  • 将 varnish_hostname 替换为您的实际 varnish 主机名。
  • 80替换为实际侦听的端口清漆。
  • /the/url替换为要清除的 url 的路径部分
  • 用您要清除的 URL 中的主机名部分替换主机名。

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

编辑两个注释:

  1. 您可能必须快速键入上述内容以防止连接过早关闭,因为如今许多 http 堆栈不允许在连接建立和 HTTP 请求之间存在长时间延迟以防止半开 DoS 攻击。您可以通过提前准备整个输入,将其复制到粘贴缓冲区,然后单击鼠标粘贴整个简介来实现这一点。
  2. HTTP 请求标头必须以双换行结束,如上所示。的netcat -C选择是有转换换行符每HTTP协议CRLF炭对。