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

Jau*_* Ho 6 django performance symfony1 zend-framework ruby-on-rails

摘要

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

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

匿名

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

登录

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

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

Anon#1

  • 设置远期过期
  • 如果可能,设置ETag
  • 缓存控制:max-age = 315360000

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

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

Anon#3

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

登录#1

  • 设置远期过期
  • 如果可能,设置ETag
  • 缓存控制:max-age = 315360000

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

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

登录#3

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

你有什么建议?我会在答案进来时更新帖子.

Dan*_*Dan 2

我对缓存并不了解,但这里有一些建议:

匿名#1,2:(静态、半动态项目) 您可以将它们设置为永不过期。如果您需要更改它们,请更改它们的 URL。if-modified-since 检查很便宜,但不是免费的。

匿名#3:(动态项目) 这就是 ETag 和/或 Last-Modified 非常有用的地方。根据您所提供的服务,您可以生成一个好的 Last-Modified 标头。如果您的数据库存储了您计划显示的所有项目的修改日期,则您可以执行以下操作SELECT MAX(last_updated) FROM items_to_show警告:这会考虑数据的年龄,而不是模板的年龄,因此如果您更改了 django 模板,您将不知道如何在标头中进行传达。

或者您可以使用 ETag 执行类似的操作。它可以是生成的内容的校验和。这将考虑模板的更改。

需要注意的是,这两种缓存动态内容的方法实际上比 Web 服务器/数据库负载节省了更多的带宽。不过,您始终可以明智地使用 Expires 标头,以在页面更改是定期且可预测的情况下提供帮助。

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

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