【问题标题】:PHP session causes varnish not to cachePHP会话导致清漆不缓存
【发布时间】:2015-07-24 16:09:03
【问题描述】:

我正在努力理解清漆的行为,并希望有人能提供一些启示。

我正在做一个测试,我正在尝试使用 varnish 来缓存带有 cookie 的请求/响应。

我有一个非常简单的 PHP 脚本,它可以简单地启动一个会话。

<?php session_start(); ?>

我确实希望清漆不会因为 Set-CookieCookie 标头而缓存。

我会去取消设置这些标题:

sub vcl_backend_response {
    unset beresp.http.set-cookie;
}

sub vcl_recv {
    unset req.http.cookie;
}

请求的页面仍然没有被缓存

我知道 PHP 会发送一个缓存清除标头,这可能会受到清漆的尊重。让我们检查一下:

<?php echo session_cache_limiter(); ?>

输出:nocache

session_cache_limiter() 文档可知,nocache 将发送这些响应头来破坏缓存:

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

让我们取消设置:

sub vcl_backend_response {
    unset beresp.http.expires;
    unset beresp.http.pragma;
    unset beresp.http.cache-control;
    unset beresp.http.set-cookie;
}

此时我希望清漆能够缓存,但仍然没有缓存

有效的解决方法是设置一个 ttl:

sub vcl_backend_response {
    unset beresp.http.expires;
    unset beresp.http.pragma;
    unset beresp.http.cache-control;
    unset beresp.http.set-cookie;

    # THIS MADE VARNISH TO CACHE
    set beresp.ttl = 10m;
}

现在是问题

如果默认值为 2m(以下 CLI 中的 -t 120)并且所有缓存清除标头都已处理,为什么我需要显式设置 TTL?

/usr/sbin/varnishd -P /var/run/varnish.pid -f /etc/varnish/default.vcl -a :80 -T 0.0.0.0:6082 -t 120 -u varnish -g varnish -S /etc/varnish/secret -s malloc,512M

我错过了什么吗?有没有不同的方法,不设置 TTL(我更喜欢)?

【问题讨论】:

    标签: php session varnish


    【解决方案1】:

    问题是 Varnish 评估 Expires 后端响应标头之前 vcl_backend_response 被调用。结果是传递给vcl_backend_response 的对象已经有一个过期的TTL(假设标头有一个过期的日期)。下一个客户端请求将命中缓存的对象,但由于对象过期(HIT-FOR-PASS)而未命中。是的,您正在取消设置 Expires 标头(通过 unset beresp.http.expires;),但到那时为时已晚。

    现在我不确定这是一个错误,还是 Varnish 开发人员对 RFC 的解释。

    我了解您的代码可能只是用于测试目的,但您最好不要在 VCL 中与缓存标头作斗争。使用适当的值(publicprivatenocache)调用 PHP 的 session_cache_limiter(),或者禁用它(session_cache_limiter(''))并自行控制标头。

    如果您使用的是 PHP 会话,您仍然需要处理 cookie 标头使其无法缓存,但这是超出问题范围的另一个问题。

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2023-04-11
      • 1970-01-01
      • 2011-07-02
      • 2016-04-19
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多