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

时间:2009-04-08 09:35:03

标签: ruby-on-rails django performance zend-framework symfony1

摘要

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

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

匿名

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

    1. 静态
    2. 半动态(js / css)
    3. 动态
    4. 一般来说,所有的Anon都应该是可缓存的,并且大部分都是登录的(忽略动态,暂时没有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

      • 缓存控制:s-maxage = 0,必须重新验证

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

这两种缓存动态内容的方法都需要注意 他们真的 比网络节省更多带宽 服务器/数据库负载。您可以随时明智地使用Expires 虽然标题是帮助在页面的更改是周期性的情况下 可预测的。

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

一般情况下,我会使用ETag或Last-modified,但不能同时使用。

答案 1 :(得分:2)

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

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

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

如果要查看性能差异,请将<?php die('hello world');的apachebench结果与提供静态.html页面进行比较。

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

答案 2 :(得分:1)

ySlow pages上有一些相关的建议。

显然

Etags might not be a good idea

答案 3 :(得分:0)

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

-