2012-08-10 101 views
4

我使用下面的代码要清除网站的首页:所以现在我认为它PURGE清漆缓存失败

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 

$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); 

从光油的响应预期被清除,但进一步调用页面来检查标题表明它不被清除。由于Age: 15X-Cache: HIT都被设置,表明页面仍然被缓存并且是15秒钟。

该TTL是120.

我错过了什么吗?

感谢 杰克

+0

你可以尝试监视varnishlog输出吗?在这两种情况下,在RxHeader后检查“VCL_call,VCL_return和Hash” – Tamil 2012-08-16 12:51:53

+0

注意X-Cache:MISS。 8080是你想要的URL的一部分吗?您需要区分清漆服务器的URL和要清除的URL。我会为此添加一个可能的答案。 – arielf 2013-01-30 21:59:28

回答

3

为了消除其他PHP /卷曲问题,我会先从最基本的低级检查。

这个工作对我来说:

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

EOF 
  • 通过实际清漆主机名替换varnish_hostname。
  • 替换由实际端口清漆监听。
  • 由URL的路径部分替换/中/ URL清除
  • 在要清除URL中的主机名部分替换主机名

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

编辑有两点需要注意:

  1. 您可能需要键入上述快,以防止连接从关闭过早,因为很多HTTP栈这些天不允许连接建立和之间出现长时间的延迟HTTP请求以防止半开放DoS攻击。您可以通过提前准备好整个输入,将其复制到您的粘贴缓冲区,然后通过单击鼠标粘贴整个区域来达到此目的。
  2. HTTP请求标题必须以如上所示的双重新行结束。 netcat -C选项用于按照HTTP协议将换行符转换为CRLF字符对。
1

我想评论说,你应该张贴您的default.vcl文件,但我的名声太低。

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

+1

它就在那里,我只是使用了文档化的建议。它必须工作,因为我得到预期的响应'HTTP/1.1 200 Purged.' – 2012-08-20 08:31:13

+0

您得到预期响应的原因是vcl_miss与vcl_hit的作用相同。如果URL不在缓存中,或者主机名不匹配,或者URL拼写错误等,则会产生误导性的“清除”响应。我编辑了@deep答案,以便在vcl_miss案例中更正确地作出回应。现在这个例子适用于我。 – arielf 2013-01-30 21:56:17

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"; 
     } 
} 
1

只是要知道,PURGE在beReq上工作。

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