【问题标题】:Wordpress Varnish Age=0 or Not Caching (Cookies?)Wordpress Varnish Age=0 或不缓存(Cookies?)
【发布时间】:2014-05-02 23:47:45
【问题描述】:

我正在使用 Wordpress 3.8.1 和 Varnish 3.0.5。由于 VCL 的噩梦,我确定 Varnish 没有缓存。而且我也不知道 Wordpress 非常标准/正确的 VCL 在哪里。

我的 Wordpress 是 Multisite,我将 Varnish 放在了 Wordpress VM 本身的顶部。 Varnish @ 8080Apache @ 80/443

由于我对VCL一无所知,所以我只是使用了一个我发现的随机VCL:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .connect_timeout = 60s;
    .first_byte_timeout = 60s;
    .between_bytes_timeout = 60s;
}

sub vcl_recv {
    if (req.restarts == 0) {
        if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }
    if (req.request == "PURGE") {
        if ( client.ip != "xx.xx.xx.xx") {
            error 405 "Not allowed.";
        }
        return (lookup);
    }
    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "PUT" && 
        req.request != "POST" &&
        req.request != "TRACE" &&
        req.request != "OPTIONS" &&
        req.request != "DELETE") {
            return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        return (pass);
    }
    if (!(req.url ~ "wp-(login|admin)") &&
        !(req.url ~ "&preview=true" ) ) {
        unset req.http.cookie;
    }

    if (req.http.Authorization || req.http.Cookie) {
        return (pass);
    }
    return (lookup);
}

sub vcl_hit {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return (deliver);
}

sub vcl_miss {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return (fetch);
}

sub vcl_fetch {
    if (!(req.url ~ "wp-(login|admin)")) {
        unset beresp.http.set-cookie;
        set beresp.ttl = 96h;
    }

    if (beresp.ttl <= 0s ||
        beresp.http.Set-Cookie ||
        beresp.http.Vary == "*") {
            set beresp.ttl = 120 s;
            return (hit_for_pass);
    }
    return (deliver);
}

(我用我的 ip 为 'xx.xx.xx.xx')

但无论如何,这不是通过始终获取age : 0 来实现的。我知道 VCL 必须处理 Wordpress COOKIES 和其他 COOKIES,如 G.A 等。

怎么做,或者我在哪里可以找到 Wordpress 的标准/正确 VCL?

【问题讨论】:

  • 您在vcl_recv 中具有正确的功能,但我不确定是否有其他冲突,尽管您确实应该删除所有默认内容,它已经由 varnish it self 执行。跨度>
  • 这里有同样的问题。内容都被缓存了,比如图片和css文件,但是主页本身总是在标题中显示Age: 0。出了点问题。

标签: wordpress caching cookies varnish varnish-vcl


【解决方案1】:

看看下面的清漆模板,wordpress 的模板相当不错。认为这是解决您的问题的最快方法。根据您现有的 vcl 手动修复它需要更多时间。

https://github.com/mattiasgeniar/varnish-3.0-configuration-templates

【讨论】:

    【解决方案2】:

    如果请求包含任何 Cookie 标头,则 Varnish 不会缓存该请求。 如果您发现对图像或 css 等资产的请求未缓存,您可以删除该请求的 Cookie 标头,因为它们通常不需要,check here 形成示例。

    您可以使用 varnishlog 命令实时查看 varnish 中的日志。如果您在实时站点上执行此操作,则可以过滤日志,例如使用:

    varnishlog -m RxURL:/my/page.php
    

    您可以查看documentation 以获取其他参数。

    我不建议只使用您找到的随机 vcl,您可以将其作为起点,然后我鼓励您阅读 Varnish 文档以了解每个规则的作用,因为实际上并不需要许多规则它们是默认的 Varnish 行为。安装 varnish 时可以看到 default.vcl 文件。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 2015-06-06
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2017-02-08
      • 2018-05-08
      相关资源
      最近更新 更多