mar*_*ark 8 performance cache varnish
我正在缓存动态生成的页面(PHP-FPM、NGINX)并在它们前面有清漆,这非常有效。
但是,一旦达到缓存超时,我就会看到:
我想做的是:
在我的情况下,过时信息不是一个大问题的网站,尤其是当我们谈论几分钟的缓存超时时。
但是,我不希望惩罚用户排队等待,而是立即提供一些东西。这在某种程度上可能吗?
为了说明这一点,以下是对我的服务器运行 5 分钟的示例输出,该服务器配置为缓存一分钟:
HTTP/1.1,200, 1.97, 12710,/,1,2013-06-24 00:21:06
...
HTTP/1.1,200, 1.88, 12710,/,1,2013-06-24 00:21:20
...
HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:22:08
...
HTTP/1.1,200, 1.89, 12710,/,1,2013-06-24 00:22:22
...
HTTP/1.1,200, 1.94, 12710,/,1,2013-06-24 00:23:10
...
HTTP/1.1,200, 1.91, 12709,/,1,2013-06-24 00:23:23
...
HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:24:12
...
Run Code Online (Sandbox Code Playgroud)
我省略了大约运行的数百个请求0.02
。但是我仍然担心用户必须等待近 2 秒钟才能获得原始 HTML。
我们不能在这里做得更好吗?
(我遇到Varnish send while cache,听起来很相似,但不完全是我想要做的。)
解决方案
Shane Madden 的回答包含了解决方案,但我没有立即意识到。还有一个细节我没有包含在我的问题中,因为我认为它不相关,但实际上它是。
我目前使用的 CMS 解决方案有一个 varnish 数据库侦听器,因此能够通知 varnish 禁止内容已更改的页面。它发送了一个PURGE
带有一些正则表达式的请求来禁止某些页面。
总结一下,有两种情况我遇到了不幸的用户:
在这两种情况下,我都有“不幸”的用户。在第二种情况下,后端用户通常在页面更改后检查页面这一事实缓解了这种情况;但不一定。
尽管如此,对于第二种情况,我创建了一个解决方案(是的,我意识到这个问题是从为第一种情况寻找答案开始的……我的问题表述得很糟糕):
我没有发送清除请求,而是使用 Shanes 建议并调整了 VCL,以便我的 varnish 数据库侦听器可以发送特殊请求以获取hash_always_miss
设置为的页面true
。
使用当前的架构,我真的没有能力进行真正的异步请求,但是借助如何在 PHP 中进行异步 GET 请求?我能够制作一个对 varnish 的 GET 请求,它不会等待页面加载,但足以触发 varnish 从后端获取页面并缓存它。
最终效果是数据库侦听器将请求发送到 varnish,当我轮询特定页面时,它从未使我的请求“不走运”,但是一旦 varnish 完全从后端获取页面(这可能从 300 毫秒到 2 秒不等)它突然在那里。
我还必须找到一个解决方案,如何在正常的 TTL 耗尽时避免同样的问题,但我想该解决方案也与 Shane 建议的完全一样:使用 wget 触发hash_always_miss
,我只需要足够聪明就可以获取列表我必须刷新的页面数。
我用来解决这个问题的解决方案是确保页面上的 TTL 在刷新之前永远不会过期 - 强制在我的系统之一上运行的 HTTP 客户端获得慢速加载,而不是不幸的客户端要求。
就我而言,这涉及wget
到 cron,发送一个特殊的标头来标记请求并req.hash_always_miss
基于此进行设置,强制将内容的新副本提取到缓存中。
acl purge {
"localhost";
}
sub vcl_recv {
/* other config here */
if (req.http.X-Varnish-Nuke == "1" && client.ip ~ purge) {
set req.hash_always_miss = true;
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
对于您的内容,这可能意味着将 Varnish TTL 设置为 5 分钟左右,但将 cron'd wget 配置为每分钟发出一次缓存刷新请求。
归档时间: |
|
查看次数: |
8356 次 |
最近记录: |