Web前端缓存网站的最佳实践?

摘要

当我正在查看stackoverflow和网络时,我发现通常缺乏关于缓存使用会话的高性能站点的最佳实践的良好文档。 如果我们可以围绕一些基本构建块分享一些想法,特别是在缓存方面,那将会很有帮助。 出于本讨论的目的,我正在避免使用memcache,并专注于完全生成的静态和页面的缓存。

因此,要设置场景,想象一下Web服务器(比如nginx),反向代理(比如清漆),app server(无论如何),db server(比如mysql)。

匿名

  1. 静态项目(gif / jpg等)
  2. 半动态(js / css)
  3. 动态

登录

  1. 静态的
  2. 半动态(js / css)
  3. 动态

一般来说,所有的Anon都应该是可缓存的,并且大部分都是登录的(忽略动态,现在没有ESI)。

Anon#1

  • 设置远期过期
  • 如果可能,设置ETag
  • Cache-Control:max-age = 315360000

Anon#2 (如果动态生成其他Anon#1规则,则反向代理缓存结果)

  • Cache-Control:public,s-maxage = 3000

Anon#3

  • Cache-Control:public,s-maxage = 300

登录#1

  • 设置远期过期
  • 如果可能,设置ETag
  • Cache-Control:max-age = 315360000

登录#2 (如果动态生成其他登录的#1规则,则使用反向代理缓存结果)

  • Cache-Control:public,s-maxage = 3000

登录#3

  • Cache-Control:s-maxage = 0,必须重新validation

你有什么建议? 我会在答案进来时更新post。

我不知道有关缓存的一切,但这里有一些建议:

Anon#1,2 :(静态,半动态项目)您可以将它们设置为永不过期。 如果您需要更改它们,请更改其URL。 如果修改 – 因为支票很便宜但不是免费的。

Anon#3 :(动态项目)这里的ETags和/或Last-Modified非常方便。 根据您所服务的内容,您可以生成良好的Last-Modified标头。 如果您的数据库存储了您计划显示的所有项目的修改日期,则可能会产生SELECT MAX(last_updated) FROM items_to_show警告:这会考虑数据的年龄,而不是模板的年龄,因此如果您更改了django模板,那么您将不知道如何在标题中进行通信。

或者你可以用ETag做类似的事情。 它可以是生成的内容的校验和。 这将考虑更改模板。

使用这两种缓存动态内容的方法需要注意的是,与Web服务器/数据库负载相比,它们确实可以节省更多带宽。 您可以随时明智地使用Expires标头,以帮助在页面更改是定期和可预测的情况下。

我对登录的东西的建议是类似的,除了我会看看Vary标题。 这可以向缓存代理发出信号,表明不同的登录用户将不会被提供相同的内容。

一般来说,我会使用ETag或Last-modified,但不能同时使用两者。

我对此的最佳答案是,您可以为所有静态文件提供大量选项,这些文件可以以自己的方式产生大量收益,每种都有益于特定场景,因此根据您的具体需要权衡利弊。 。

然而,大多数人忽略的是他们的动态内容,确保缓存db结果等很好,但仍然涉及实际启动PHP / ASP或其他任何解析引擎。

如果你看一下wordpress的超级缓存插件,你会发现它能够将你的html实际准备为静态文件。 不仅如此,它还制作了一个gzip副本,并使用重写规则来检查这些文件是否存在,作为启动解析器的适当替代方法。 这显然会给你最好的结果,因为它不仅可以节省你的处理时间,还可以节省带宽。

如果你想看到性能差异,比较的apachebench结果 提供静态.html页面。

显然你需要小心这种缓存,但是从像PHP这样的解释器中替换fullpage缓存会非常有用。

ySlow页面上有一些相关的建议。

Etags显然可能不是一个好主意 。

我建议阅读可扩展的互联网架构有几个章节致力于通过缓存,CDN等进行扩展。它应该指向正确的方向来开始。 帮助我扩大了我支持的网站。