加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP会话导致varnish不缓存

发布时间:2020-12-13 16:57:29 所属栏目:PHP教程 来源:网络整理
导读:我正在努力理解清漆的行为,并希望有人可以解决一些问题. 我正在做一个测试,我正在尝试使用varnish来缓存请求/响应cookie. 我有一个非常简单的PHP脚本,它简单的启动会话. ?php session_start(); ? 我确实希望varnish不要因为Set-Cookie和Cookie标头而缓存. 我
我正在努力理解清漆的行为,并希望有人可以解决一些问题.

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

我有一个非常简单的PHP脚本,它简单的启动会话.

<?php session_start(); ?>

我确实希望varnish不要因为Set-Cookie和Cookie标头而缓存.

我会去取消这些标题:

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

sub vcl_recv {
    unset req.http.cookie;
}

请求的页面仍未缓存.

我知道PHP会发送一个可能被varnish尊重的缓存破坏标头.让我们检查:

<?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;
}

至于这一点,我希望varnish能够缓存,但仍然没有缓存.

有效的修复是设置一个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

我错过了什么吗?是否有不同的方式,whitout设置TTL(我更喜欢)?

解决方法

问题是Varnish在调用vcl_backend_response之前评估Expires后端响应头.结果是传递给vcl_backend_response的对象已经有一个过期的TTL(假设标题有一个过期的日期).下一个客户端请求将在缓存对象上命中,但是由于对象已过期(HIT-FOR-PASS),因此会丢失.是的,你没有设置Expires标头(通过unset beresp.http.expires;),但它已经太晚了.

现在无论这是一个bug,还是Varnish开发人员对RFC的解释我都不确定.

我知道您的代码可能仅用于测试目的,但最好不要在VCL中与缓存标头作斗争.使用适当的值(public,private,nocache)调用PHP的session_cache_limiter(),或者禁用它(session_cache_limiter(”))并自己控制头文件.

如果您正在使用PHP会话,您仍然必须处理cookie标头使其无法缓存,但那是超出问题范围的另一个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读