推送新代码后,Mod_pagespeed、Varnish 和 Apache 缓存出现问题

推送新代码后,Mod_pagespeed、Varnish 和 Apache 缓存出现问题

我遇到了一个相当奇怪的问题。在我的环境中,我们运行一个由 8 个 Apache 服务器组成的负载平衡集群,该集群具有主主 MySQL 后端。在 Apache 前面,我们在缓存层中使用 Varnish。

我们已经运行 Apache mod_pagespeed 几个星期了,大部分时间运行良好。当我们从 Git 进行新的代码更新时,问题就出现了,并且所有 JS/CSS 资产都发生了变化。

基本上,问题似乎有两个方面。首先,在代码推送后,我们通常会借此机会刷新 varnish、重新启动 apache,然后再重新启动 varnish。在此过程中,所有 mod_pagespeed 合并/最小化文件都会被清除,以确保所有新的 JS/CSS 资产都是最新的。问题是,在执行此操作后,mod_pagespeed 创建的文件名会发生变化,但旧文件(似乎)仍缓存在客户端,这会导致非常意外的结果。但是,如果我们不重新启动 apache,由于缓存的最小化资产,对文件的更改可能会或可能不会出现在客户端。

简单的解决方案是禁用 mod_pagespeed,但是我宁愿不这样做,因为它对性能产生了相当大的影响。

我觉得好像必须有更好的方法来处理客户端和服务器之间的缓存不一致,以防止人们费尽心思或执行大量页面刷新才能看到正常工作的页面。

如果有人需要,我可以提供配置片段。

如果您想检查站点、来源、标题或任何内容,请尝试以下地址:

http://wellplayed.org

http://wellplayed.org/tv

提前致谢!

答案1

只是为了确保我理解了这个问题,看起来你正在修改从 varnish 提供给 mod_pagespeed 的文件,并且带有过期标头,当它在后端被更改后,这些文件仍然被缓存。

如果是这种情况,您有几个选择。您可以配置后端(varnish)以发送更短的过期标头。或者,您可以配置非缓存资产以链接到缓存版本,并在进行更改时增加补丁号。因此它们变成:

http://site.com/asset.gif?p=930024982afb191

看起来你还可以在 mod_pagespeed 中调整其他旋钮来更改某些文件的到期时间:

http://code.google.com/speed/page-speed/docs/filter-cache-extend.html

另外,关于客户端,这里有更多有关它们如何操作的信息,这将有助于配置 varnish 和 mod_pagespeed:

http://code.google.com/speed/page-speed/docs/filter-cache-extend.html

答案2

您写了有关冲洗 Varnish 的内容。实际上,有两种不同的方法可以做到这一点:

  1. 根据特定的 URL 及其变体(通常是不同的语言版本或压缩/未压缩版本)删除特定的文档(HTML 页面、图像、CSS 文件或其他内容) - 这通常称为清除
  2. 根据正则表达式使一组文档(HTML 页面、图像、CSS 文件或其他)无效 - 这称为禁止

对于您来说,禁止所有 HTML、CSS 和 JS 文件可能是一个好主意。

欲了解更多信息,请点击此链接或询问:https://www.varnish-cache.org/docs/3.0/tutorial/purging.html

相关内容