没错就是这本书:
封面

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头信息,用来描述响应内容的:类型、长度、缓存指令、验证令牌等信息