记一笔keep-alive和cache-control
以前看的时候大多走马观花,补补课,记一笔吧。
- 对于静态内容在HTTP Header中设置过期时间和最大时间,可以有效的使浏览器避免下载已经下载过的文件。
- js,css,图片什么的都是静态内容,都应该考虑cache,但是html不是静态内容。
- Expires和Cache-Control: max-age是资源终身鲜活的Cache控制。浏览器在过期之前不进行资源的鲜活检查。
- Last-Modified 和ETag则是对资源的一种描述,属于启发式的Cache控制,浏览器在检查之后再决定使用Cache与否。
- Expires 和Cache-Control: max-age,作用相同,设置其中一个即可,Last-Modified 和Etag也是冗余的设置,设置其中一个即可。
- 设置Expires,Cache-Control支持率不及Expires。这个值通常设置1个月,不要超过1年。如果不知道过期时间,就设长一点,当发生变化的时候使用URL的指纹。
- 要考虑到代理服务器的Cache情况,使用Cache-Control的public还是private。通常来说要set-cookie的地方就不要让代理Cache,所以设置为Private。
- 代理Cache的情况还有压缩与否的问题,有两种方法,一种是把Cache-Control设置为Private,使代理服务器不Cache这些内容。另一种是设置Vary: Accept-Encoding的Header,这可以使代理Cache两种内容,压缩的与不压缩的。
- 避免Firefox的URL哈希冲突,Firefox的URL哈希算法有8个字符的冲突边界。所以两个资源的URL差异应该在8个字符以上。
- 设置正确的Vary Header,IE对于设置了Vary头的资源是不Cache的,有例外,Vary头的值是Accept-Encoding和User-Agent的时候可以被IE给Cache,所以要么不设Vary头,要么就对Vary头进行裁剪。
HTTP Keep-alive呢,重点看以下几个文档:
- http://httpd.apache.org/docs/2.0/mod/core.html#keepalive
- http://en.wikipedia.org/wiki/HTTP_persistent_connection
- http://en.wikipedia.org/wiki/Keepalive
- Apache的KeepAlive设置与优化 – 老黄纸条箱(这篇是精华)
Keep-alive是指在同一个连接中发出和接收多次HTTP请求。优点是:
- 使用较少的CPU和内存
- 开启HTTP 管道
- 减少网络拥堵
- 在接下来的请求中,减少传输时间。
- 错误可以被报告但是不关闭TCP连接。
在RFC 2617第47页里,一个用户客户端对任何服务器或代理不能维持2个以上的连接。代理可以维持2xN个连接。
IE6和7使用 2个长连接,IE8使用6个,都是在60秒之后超时。 Firefox的长连接都是在300秒超时,同时使用的连接可以自定义(按每主机或总计),Opera与Firefox类似。
Last modified on 2009-12-02