如何在Varnish中发送清除缓存请求

23

如果我重复了之前的问题,请见谅,我没有找到类似的问题。

我们在系统上运行Varnish缓存,但希望安装一个系统,当编辑页面时可以清除单个页面(相当普遍)。我们一直在尝试通过使用HTTP头让它工作。因此,我们的 VCL 设置如下:

acl purge {
      "localhost";
#### Our server IP #####
}

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

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

sub vcl_miss {
        if (req.request == "PURGE") {
                 purge;
        }
}

然而,我不知道如何发送http清除请求。我们的网站是使用PHP编写的,因此我尝试使用以下代码:

header("PL: PURGE / HTTP/1.0");
header("Host: url to purge");

但是这似乎没有起作用(而且varnishlog似乎也没有显示任何“清除”操作)。

我也尝试使用cURL进行实验,但同样没有起作用。 我错过了一些非常基本的东西吗,还是基础部分可靠,意思是我的实现有错误?

非常感谢。

4个回答

36

你需要进行HTTP请求。

以下内容仅供参考(如果你想使用像curl这样的工具):

$curl = curl_init("http://your.varnish.cache/url-to-purge");
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_exec($curl);

2
是的,PURGE和GET或POST一样都是HTTP请求 -- 尽管它比RFC 2616更新,但它被内容缓存和代理(如Squid、Varnish和Apache Traffic Server)使用。通过快速谷歌搜索“PURGE curl_setopt”,我们可以找到这个例子。祝您使用愉快 :) - TerryE
1
或者对于更加临时或脚本驱动的方法,您也可以使用 curl -XPURGE "http://your.varnish.cache/url-to-purge" - Cameron Kerr

5

发送PURGE请求的快速、简单且有效的方法:

curl -v -k -X PURGE URL

你可以使用以下语句编写一个小脚本,具体如下:
1)打开编辑器,例如VI
 vi varnish_purge_url.sh

2)输入以下文本:

#!/bin/sh

curl -v -k -X PURGE $1

(记得在第一行和最后一行之间留下空行)。

3)保存文件并退出。然后设置适当的属性以使其可以从shell中执行:

chmod 750 varnish_purge_url.sh

4) 在创建和使用上述脚本时,您需要成为root用户。如果使用Ubuntu,请在必要时在命令前添加sudo

5) 使用方法很简单:

./varnish_purge_url.sh URL

URL 是需要清除的链接地址。


4

您也可以使用命令行进行清除。使用命令sudo varnishadm,这将打开Varnish命令行界面,您可以输入命令按照需要清除页面。例如,要清除主页,请执行以下操作:

root@staging:/etc/varnish# sudo varnishadm
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.5.0-28-generic,x86_64,-sfile,-smalloc,-hcritbit

Type 'help' for command list.
Type 'quit' to close CLI session.

varnish> ban.url ^/$
200  

1
不,您不能使用varnishadm清除缓存 - 只能像您的示例中那样禁用。即使最终结果相似,禁用和清除缓存并不是相同的功能。 - Clarence

0
也许我使用的是更新版本,但上面的方法对我不起作用。这个可以:
sub vcl_hit {
  if (req.request == "PURGE") {
    ban("req.url ~ "+req.url);
    error 200 "Purged.";
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接