《高性能网站建设指南》读书笔记
1.性能黄金法则:
只有10% ~ 20%的最终用户响应时间花在了下载HTML文档上。其余的80% ~ 90%时间花在了下载页面中的所有组件上。
2.HTTP是C/S协议 除了常见的GET、POST请求还有HEAD、PUT、DELETE、OPTIONS和TRACE请求。
3.304 Not Modified
304加快了页面加载速度,服务器在返回的响应中包含Last-Modified,该时间带遍组件的“新鲜”日期,下次请求浏览器通过If-Modified-Since把时间修改日期发给给服务器对比。相同说明没有变动,浏览器中缓存的文件是最新的,可用,服务器返回304,Not Modified,不再发送响应体,也就不用再对请求发送该文件,使页面整个响应更快。
详情:详解304
4.减少http请求
- 1.图片地图(已经很少见)
- 2.css sprites
- 3.内联图片,并把data写在css里的background属性,而不写在
<img>
标签中减少请求数 - 4.合并js、css文件
5.长期缓存
添加Expires头信息配置Cache-Control
HTTP 1.1协议中:Cache-Control:public,max-age=31536000
max-age设定缓存有效时间为31536000秒(一年)!最大可设置为10年!
public表示可缓存,哪怕响应状态码无法缓存,响应也可缓存。但通常不必须,因为max-age已经表示可缓存。
private表示为单个用户的数据缓存,浏览器可缓存,但中继缓存不能缓存
Keep-Alive
每个HTTP请求都会先建立打开一个socket连接,没建立新的socket连接都耗费时间,所以设置Connection:keep-alive
可使浏览器在一个单独的连接上尽享多个请求。可通过Connection:close
关闭。
5.CDN(内容发布网络)Content Delivery Network
一组分布在不同地理位置的web服务器,像用户更加有效的发布内容,最近距离,解决网络拥挤,提高总体访问速度。各大公司几乎都有。我的博客用的七牛。
配置ETag
ETag(Entity Tag)实体标签它决定了浏览器缓存文件和服务器文件是否有效。
ETag是一个文件的版本标志字符串,浏览器缓存后通过If-None-Match发送给服务器,匹配一致说明缓存文件是“新鲜”可用的,则返回304,而不在发送文件体。
ETag的问题
一个浏览器请求对应一个服务器,ETag是没问题的,但若有多个服务器(服务器集群)时,浏览器请求中的ETag依然唯一匹配众多服务器中的一个,10台服务器匹配成功的概率为十分之一。十次有九次依然重新下载返回200。
且If-None-Match比If-Modified-Since有更高的优先级。想只匹配时间,忽略ETage?这是http1.1规禁止的。必须要两个都一致才会返回304.
Google Developers上有关ETag的说明:
ETag解决了max-age超时问题,当超出缓存时间后避免浏览器和服务器之间重新加载文件,使用了ETag,ETag通常是文件内容的哈希值或某个其他指纹码。客户端不用考虑如何生成,只需把ETag发送给服务器,如果相同则不用重新下载,哪怕max-age超出。
no-cache
no-cache表示必须先和服务器验证文件的有效性。先验证再进行后续操作,是否重发。
no-store
直接禁止浏览器和所有中继缓存。使请求每次都是新的,比如客户隐私数据(Ajax)
总之尽可能多的缓存50%以上,甚至90%,尽可能长的缓存时间,且为响应的文件提供效验令牌ETag,这样哪怕超时,令牌一样依然可以304。
借用Google Developers一张图:缓存策略决策树
解决办法
ETag包含一串标志码和ChangeNumber 如: ETag:"fabe08e29bce1:0"
配置ETag或干脆移除ETag,只用时间做比较
配置ETag:设置服务器(Apache)通过FileETag指令从ETag中移除inode,使ETag只包含文件大小和时间戳。
IIS为所有服务器设置相同的ChangeNumber,保留时间戳作为ETag的另一部分信息。
这将导致:
Apache服务器下所有ETag只包含文件大小和时间戳。大量重复信息
IIS服务器下只有时间戳(因为ChangeNumber都一样,无可比性),大量重复信息
且这些无实际意义的重复信息又增加了响应、请求http头文件的大小。 所以干脆移除ETag:FileETag none
优化ajax请求
Cache-Control不为no-store
减少DNS查询
域名要转为IP地址,DNS提供转换,但转换耗费时间,浏览器自身缓存DNS,操作系统也保留DNS记录。如果浏览器没有该DNS记录,先向操作系统询问,如果操作系统也没有则向远程服务器查询对应的IP地址。
压缩组件gzip
服务器返回响应
服务器返回响应时,会发出一组HTTP头信息,用来描述响应内容的:类型、长度、缓存指令、验证令牌等信息