通过 CloudFlare 向 Varnish 发出 varnish purge 请求

通过 CloudFlare 向 Varnish 发出 varnish purge 请求

我已经研究这个问题一段时间了,但似乎找不到任何解决方案。

我的 nginx 服务器前面有 varnish,CloudFlare 也位于前面。

当我发出 curl -X PURGE host 时,CloudFlare 会拾取它并当然会拒绝它并显示 503 错误。如果我使用 direct.host 绕过 CloudFlare,它会访问 Varnish 服务器并接受请求,但它什么也不做,因为 direct.host 未被使用,所以缓存中没有该 URL 的任何内容。

我正在使用 WordPress,并且有一个 WordPress Varnish Purge 插件,它说将以下行添加到wp-config.php

define('VHP_VARNISH_IP','127.0.0.1')

这是专门与代理服务器和/或 CloudFlare 配合使用的,以确保请求发送到 Varnish 服务器而不是 CloudFlare,但这似乎没有帮助。

有人见过这个并且有什么想法吗?

答案1

您的问题是清除请求由 ClodFlare 而不是 Varnish 处理。

请记住:

  • purge;在 Varnish 3 中你应该使用set obj.ttl = 0s;
  • Varnish 将使用 来解析对象vcl_hash。在 Varnish 3 中,这意味着默认情况下 [1],req.url 将与 HTTP“Host”标头一起使用,如果不存在,则使用服务器 IP:

    sub vcl_hash {
      hash_data(req.url);
      if (req.http.host) {
        hash_data(req.http.host);
      } else {
        hash_data(server.ip);
      }
      return (hash);
    }
    
  • 您可以覆盖vcl_hash以满足您的需求

请参阅文档 [2] 和 Varnish Book 信息 [3] 中的 Bans & Purges

我认为您有以下选择:

  1. 绕过 CloudFlare,直接向 Varnish 发出清除命令,直接使用curl -H "Host: _host_wich_has_the_url_to_purge" -X PURGE http://_varnish_ip_:_varnish_port/_url_to_purge_
  2. 尝试将 CloudFlare IP 范围添加到您的acl purge(不推荐)并指示 CloudFlare 将此类请求传递给 Varnish。

[1]https://www.varnish-cache.org/docs/3.0/reference/vcl.html#examples

[2]https://www.varnish-cache.org/docs/3.0/tutorial/purging.html

[3]https://www.varnish-software.com/static/book/Cache_invalidation.html#removing-a-single-object

答案2

插件提示输入你的 Varnish 服务器的 IP 地址(http://wordpress.org/plugins/varnish-http-purge/faq/)。“您的 Varnish IP 必须是 Varnish 正在监听的 IP 之一。如果您使用多个 IP,或者您已自定义 ACL,则需要选择不与其他设置冲突的 IP。例如,如果您让 Varnish 监听公共和私有 IP,则您需要选择私有 IP。另一方面,如果您告诉 Varnish 监听 0.0.0.0(即“监听每个可以监听的接口”),则需要检查您设置清除 ACL 以允许的 IP(通常为 127.0.0.1,又称 localhost),然后使用该 IP(即 127.0.0.1)。”

当您手动运行清除命令(即通过 CURL)时,您输入什么来使其工作?

答案3

当您将 DNS 交给 Cloudflare 时,他们会设置 direct.yourdomain.com。您应该能够直接向该地址发出 PURGE,这将绕过 Cloudflare 并直接到达您的 Varnish 服务器。但是,请确保您拥有的任何 ACL 块都允许您发送 PURGE 的地址。

相关内容