已经有很久了。几位同事不断的跟我谈论着做静态化内容的改造。由于我们系统和用户的增涨过快,大量的web 2.0产品都面临着用户的增涨过快,极大的消耗了服务器资源。当年的三板斧的静态化板斧又冲上来了。但是显然,将一个动态的web 2.0系统做成一个静态化的系统,不是一天两天的事,但我认为大量的人力资源消耗在这件事上显然不值得。这里记下自己尝试着需要记录的为动态加入 Cache功能的要点。

先来看看新浪的blog首页和我的页面:

访问http://blog.sina.com.cn的首页,它返回的Header如下: HTTP/1.1 200 OK Date: Mon, 09 Jul 2007 11:26:19 GMT Server: Apache/1.3.37 (Unix) Cache-Control: max-age=600 Expires: Mon, 09 Jul 2007 11:36:19 GMT Last-Modified: Mon, 09 Jul 2007 11:15:11 GMT ETag: “451ed-4d003-469218bf” Accept-Ranges: bytes Content-Length: 315395 Content-Type: text/html

访问http://blog.sina.com.cn/hdcola,它返回的Header如下: HTTP/1.1 200 OK Date: Mon, 09 Jul 2007 11:28:01 GMT Server: Apache/1.3.37 (Unix) Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT Set-Cookie: SessionID=xxxxxxxxxxxxxxxxxx; path=/ Pragma: no-cache Transfer-Encoding: chunked Content-Type: text/html

这里我们把跟Cache system相关的东东提出来,一个个看看(可以在w3c的HTTP 1.1中查看RFC2616 中的相关定义)。

首先是Cache-Control。它用来指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache -Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max- stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。我们来说说响应消息,因为它是服务器发出的,对于客户端和Cache System都有非常重要的意义: Public 指示响应可被任何缓存区缓存。 Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache 指示请求或响应消息不能缓存 no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存 max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 no-transform 不允许转换存储系统 must-revalidate 使得客户端再次浏览当前页时必须发送相关 HTTP 头信息到服务器进行验证,然后才决定是否加载客户端本地 cache

从上面两个HTTP回应头来看,blog.sina.com.cn显然是一个期望应用cache的页面。它告诉我们可以在600秒内缓存该页面的内容。而我自己的首页是一个非常不欢迎cache的页面,程序员把他能知道的不让客户端和反向代理cache的关键字都用上了。注意,这个程序员还加了post-check=0, pre-check=0这两个IE 5.0才有的防cache声明。汗。。。看来用户和程序员都非常在意,每个个人的blog页面都必需从服务器端取得实时的数据。

其它的几个HTTP头也非常有意义,一起来看看: Date 表示消息发送的时间,时间的描述格式由rfc822定义 Expires 缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前又回到此页,就会显示缓冲区中的版本 Last-Modified 最后更新网页的时间 ETag 网页的tag校验码

知道了这几个头信息的意义,就可以了解到blog的首页要比我们个人的页面友好的多。它更容易被cache system所使用。有许多人会说,blog的首页哪是发布系统发布出来的静态页面,当然会好很多。自己写的代码,哪有这样好呀。确实,所有的web服务器在静态页面的输出时对cache system非常友好,这是我本机的lighttpd的输出头: HTTP/1.1 200 OKContent-Type: text/html Accept-Ranges: bytes ETag: “2116784511” Last-Modified: Mon, 09 Jul 2007 17:05:47 GMT Content-Length: 4454 Date: Mon, 09 Jul 2007 17:07:16 GMT Server: lighttpd/1.4.15

原文 http://blog.sina.com.cn/s/blog_5595d51401000b23.html