【问题标题】:varnish vcl purging cache selectively清漆 vcl 有选择地清除缓存
【发布时间】:2012-04-20 16:56:36
【问题描述】:

所以我是第一次使用清漆。我花了很长时间阅读它的工作原理,但我无法弄清楚如何选择性地清除缓存。

比如说我有这样的网址

/?account=123&url=google.com

还有一个喜欢

/?account=123&url=stackoverflow.com

我需要清除account=123所在的缓存。

我只能弄清楚发出 purge on

/?account=123&url=stackoverflow.com

只会清除 url 与传入 url 使用 PURGE 方法匹配的缓存。

感谢任何帮助。

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

    HTTP PURGE 方法允许您清除特定的 url。

    要使用正则表达式进行清除,您必须使用 telnet 连接到 varnish 管理端口或使用命令行工具 varnishadm。

    通常你可以这样做

    telnet localhost 6082
    

    通过使用 telnet,在连接到 varnish 服务器后,您可以使用 purge 命令进行清除:

    purge req.url ~ /?account=123
    

    上面将清除每个匹配“/?account=123”的网址

    如果您想像使用 HTTP PURGE 请求一样清除特定页面,则必须使用双等号而不是波浪号 (~)

    purge req.url == /?account=123
    

    您还可以使用清除整个域

    purge req.http.host == yourdomain.com
    

    或您域中的特定页面:

    purge req.http.host == yourdomain.com && req.url ~ /?account=123
    

    【讨论】:

      【解决方案2】:

      所以这就是有效的。在清漆 3 中,选择性清除称为禁令。所以你需要使用

      ban("obj.http.x-url ~ " + req.url);
      

      【讨论】:

        【解决方案3】:

        我们遇到了类似的问题,最终使用单独的 X-Purge-Regex-URL 请求标头来使用 HTTP 请求清除内容。

        这是我们用来完成此任务的 VCL:

        acl purge {
          "localhost";
          "10.1.1.0"/28;
        }
        
        sub vcl_recv {
          if (req.http.X-Purge-Regex-URL) {
            if (!client.ip ~ purge) {
              error 405 "Not allowed.";
            }
            ban_url(req.url);
            error 200 "Banned URL";
          }
        }
        

        在您的情况下,我们可以使用 curl -H "X-Purge-Regex-URL: True" --head "http://my.host.addr/?account=123" 清除内容

        请注意ban_url() 不关心 HTTP 主机。它从所有主机中清除所有匹配的 URL。如果这不是你想要的,你应该使用ban() 来禁止使用req.http.hostreq.url 的内容。

        【讨论】:

          【解决方案4】:

          我不是 Varnish 专家,但这对我有用:

          acl purge {
            "localhost";
            "10.1.1.0";
          }
          
          sub vcl_recv {
            if (req.http.X-Purge-Regex-URL) {
              if (!client.ip ~ purge) {
                error 405 "Not allowed.";
              }
              ban_url(req.url);
              #error 200 "Banned URL";
            }
          }
          

          请注意,我注释掉了 error 200 "Banner URL" - 就我而言,这是导致问题的原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-28
            • 2013-01-09
            • 2012-08-07
            • 2012-11-12
            • 1970-01-01
            • 2012-04-03
            • 2016-12-17
            • 2017-07-21
            相关资源
            最近更新 更多