繁体   English   中英

Varnish Cache不会使用会话缓存PHP除非后端TTL被更改

[英]Varnish Cache not Caching PHP with Sessions Unless backend TTL altered

我是Varnish Cache的新手,有一个问题,希望我能得到一些帮助。

我有一个非常简单和基本的设置,但它不起作用,因为我理解它应该由于某种原因。

这与Varnish没有缓存使用cookie的PHP页面有关。

这是我的设置:

1)对于我的default.vcl我有一个简单的后端

backend default {
.host = "127.0.0.1";
.port = "80";
}

2)我有一个简单的PHP文件只有这两行:

session_start();
echo time();

3)当我调用此页面时,它正确无法缓存,因为我没有添加所需的vcl规则

4)

因此,根据我对文档的理解,我在这两个规则中添加了

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
return(deliver);
}

5)PHP页面仍然不会缓存。 当我在FireFox中使用FireBug时,我可以看到Set-Cookie标头已被删除。

只有当我将这个添加到子vcl_fetch时,PHP才会缓存:

set beresp.ttl = 24h;

我的问题是这是正确的吗?

我认为我不需要改变后端响应的ttl。 我认为只是取消设置cookie会强制PHP w / session缓存。

我的完整默认vcl是:

backend default {
.host = "127.0.0.1";
.port = "80";
}

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
set beresp.ttl = 24h;
return(deliver);
}

我的启动命令是:

varnishd -f /etc/varnish/default.vcl -s malloc,128M -T 127.0.0.1:2000 -a 0.0.0.0:8080

我打电话的网址是:

http://vbox.local:8080/varnish-tests/index.php

我的index.php文件只有:

<?php 
session_start();
echo time();

我想询问社区这看起来是否正确或是否错了。 基本上我只是不确定为什么我必须添加beresp.ttl = 24h才能最终将页面缓存添加到清漆中。

我以为我不需要这个。

任何建议非常感谢。

谢谢!

亲切的问候。

Varnish将遵循响应中的缓存标头。 PHP将发送缓存控制头,而不是通过deafult缓存响应

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

您需要禁用这些标头,否则Varnish将遵守,因此不会缓存页面。 要关闭它们,只需使用空字符串调用session_cache_limiter()即可

session_cache_limiter('');
header("Cache-Control: public, s-maxage=60");
session_start();

然后,您可以添加标头以将缓存控件设置为public。 使用上面的三行将启用缓存。

正如ZoFreX所说,这可能是因为你的Cache-Control或Expires标头。

另请注意,此规则有点危险:

sub vcl_recv {
    unset req.http.Cookie;
    return (lookup);
}
sub vcl_fetch {
    unset beresp.http.Set-Cookie;
    return(deliver);
}

如果您的服务器发送cookie,那可能是因为您需要它们,至少对于会话而言。 这种规则将完全禁用您的应用程序服务器的会话管理。

根据您使用会话的原因,您无法缓存内容的每个部分(例如:用户特定内容)。

您应该仔细查看PHP发送给Varnish的标头(例如,通过直接访问您的服务器而不是通过varnishd)。 如果标题说内容无法缓存,则不会。 如果他们没有说它可以缓存,那就不会 - 而且我怀疑这就是为什么Varnish只是在你手动设置ttl时才进行缓存,因为标题没有“expires”或“max-age” ”。

获得由varnish缓存的响应的最简单方法是添加缓存控制头。

PHP:

header('Cache-Control: public, s-maxage=60');

会告诉varnish缓存响应60秒。

我遇到了完全相同的问题。 当你执行session_start时,PHP似乎注意到该页面可能是动态的,并且有助于将缓存控制头重置为:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

Varnish的默认配置服从apache / php发送的这些缓存指令,这意味着它不会缓存这些页面。 我不是100%确定可以覆盖默认配置,只是为了扩展它。

我一直在使用的解决方法是重新设置Cache-Control标头,但请注意,这必须在session_start更改之后完成。 我没有测试过它是否也需要在session_write_close之后,但是比抱歉更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM