Varnish 4 工作配置(优化)适用于 Wordpress(default.vcl)

Varnish 4 工作配置(优化)适用于 Wordpress(default.vcl)

我已经成功地在我的 nginx 1.6.2 上设置了 varnish 4,它可以正常工作,但是根据

http://www.isvarnishworking.com/

表明

Varnish 似乎正在响应该 URL,但是 Cache-Control 标头的“max-age”值小于 1,这意味着 Varnish 永远不会从该 URL 的缓存中提供内容。

max-age 值似乎是:0

这可能是故意的,但如果您希望 Varnish 缓存此 URL,则必须修复应用程序发送给 Varnish 的 max-age 值。

这意味着它不起作用,但不像预期的那样,并且搜索了它的配置文件,但由于 varnish 4 版本的巨大变化,这些配置文件不起作用。

请大家帮帮我。

谢谢

答案1

我知道这是重新发布旧帖,但我还是想把这个发在这里,以便任何遇到同样问题的人都能看到。

首先,您需要删除未登录用户的 cookie。下面是我的 vcl_recv 子部分的一部分:

sub vcl_recv {
    # Some wordpress URL manipulation
        if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
            set req.url = regsub(req.url, "\?.*$", "");
        }

        # Pass if the page is login, admin, preview, search or xmlrpc
        if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "\?s=" || req.url ~ "xmlrpc.php") {
            return (pass);
        }

        # Some generic URL manipulation, useful for all templates that follow
        # First remove the Google Analytics added parameters, useless for our backend
        if (req.url ~ "(\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") {
            set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "");
            set req.url = regsuball(req.url, "\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "?");
            set req.url = regsub(req.url, "\?&", "?");
            set req.url = regsub(req.url, "\?$", "");
        }

        # Strip hash, server doesn't need it.
        if (req.url ~ "\#") {
            set req.url = regsub(req.url, "\#.*$", "");
        }

        # Strip a trailing ? if it exists
        if (req.url ~ "\?$") {
            set req.url = regsub(req.url, "\?$", "");
        }

        # Remove the wp-settings-1 cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");

        # Remove the wp-settings-time-1 cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");

        # Remove the wp test cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");

        # Remove the cloudflare cookie 
        set req.http.Cookie = regsuball(req.http.Cookie, "__cfduid=[^;]+(; )?", "");

        # Remove the PHPSESSID in members area cookie 
        set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");

        # Remove the Quant Capital cookies (added by some plugin, all __qca)
        set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");

        # Are there cookies left with only spaces or that are empty?
        if (req.http.cookie ~ "^\s*$") {
            unset req.http.cookie;
        }

        #Drop ALL cookies sent to WordPress, except those originating from the URLs defined.
        if (!(req.url ~ "(wp-login|wp-admin|cart|my-account|checkout|addons|wordpress-social-login|wp-login\.php|forumPM|members)")) {
            unset req.http.cookie;


        }
}

此外,如果您未登录,您需要在后端响应中删除 cookie。您还需要指示 varnish 设置 beresp 的 TTL,以便 Age 并不总是显示 0。

sub vcl_backend_response {

  if (!(bereq.url ~ "(wp-(login|admin)|login)")) {
    unset beresp.http.set-cookie;
  }

  set beresp.ttl = 1h;

  return (deliver);
}

这就是基础。

答案2

这个问题的解决方案并不在于正确配置 Varnish。这个说法有点太强烈了——你可以在 Varnish 中修复此问题。但你不应该这么做。

问题是 WordPress 发送了一个标头,阻止 Varnish 缓存其传送的对象。您需要找到 WordPress 中生成此标头的位置,然后修改、禁用或覆盖它。

答案3

默认情况下,WordPress 发送每一个访问者 Cookie,这使得 Varnish 认为每个访问者都是独一无二的,因此不应该被缓存。

要从 Varnish 中获得任何好处,您需要覆盖此行为,并在 HTTP 请求进入 Varnish 时“取消设置”或“删除” cookie。

网上有很多关于这个的文章,还有很多 Varnish VCL 文件和示例,你可以在这里找到其中一个: https://www.varnish-cache.org/trac/wiki/VCCLExampleTemplateWordpressNopurge

祝你好运!

相关内容