网站最初一般将其全部的服务器放在同一个地方。当用户群增长时,公司就必须面对服务器放置地点再也不适用的事实,有必要在多个地理位置不一样的服务器上部署内容。若是应用程序web服务器离用户更近,则一个http请求的响应时间将缩短。css
内容发布网络(CDN)是一组分布在多个不一样地理位置的web服务器,用于更加有效地向用户发布内容。向特定用户发布内容的服务器的选择基于对网路可用度的测量。例如,CDN可能选择网络阶跃数最小的服务器,或者具备最短响应时间的服务器。html
除了缩短响应时间以外,CDN还能够带来其余优点。如备份、扩展存储能力、缓存、缓和web流量峰值压力。web
CDN的缺点是你的响应时间可能会受到其余网站的影响,另外的缺点是你没法直接控制组件服务器所带来的特殊麻烦。例如,修改http响应头必须经过服务提供商来完成,若是CDN服务的性能降低了,你的工做质量也随之降低。数据库
CDN用于发布静态内容,如图片、脚本、样式表和flash。提供动态html页面会引入特殊的存储需求,好比数据库链接、状态管理、验证、硬件和os优化等。这些复杂性超越了CDN的能力范围。浏览器
规则3展现了如何配置组件,使其可以最大化地利用浏览器的缓存能力来改善页面的性能。缓存
页面的访问者会进行不少http请求,但经过使用一个长久的expires头,使这些组件能够被缓存。长久的expires头最经常使用于图片,但应该将其用在全部组件上,包括脚本、样式表和flash。服务器
web服务器使用expires头来告诉web客户端它可使用一个组件的当前副本,直到指定的时间为止。http规范中简要地称该头为“在这一日期/时间以后,响应将被认为是无效的”。它在http响应中发送。网络
Expires: Thu, 15 Apr 2010 20:00:00 GMT
它告诉浏览器该响应的有效性持续到2010年4月15日为止。在到期前,浏览器在后续的页面浏览中会使用缓存的图片。并发
HTTP1.1引入了Cache-Control头来克服Expires头的限制。由于Expires头使用一个特定的时间,它要求服务器和客户端的时钟严格同步。另外,过时日期须要常常检查,而且一旦将来这一天到来了,须要再服务器配置中提供一个新的日期。性能
Cache-Control使用max-age指令指定组件被缓存多久。它以秒为单位定义了一个更新窗。若是从组件被请求开始过去的秒数少于max-age,浏览器就使用缓存的版本,这就避免了额外的Http请求。一个长久的max-age头将刷新窗设置为将来10年。
Cache-Control: max-age=315360000
使用带有max-age的Cache-Control能够消除Expires的限制,你能够同时指定这两个响应头——Expires和Cache-Control max-age。若是二者同时出现,HTTP规范规定max-age指令将重写Expires头。
对于Expires带来的时钟同步和配置维护问题,mod_expires Apache模块使你在使用Expires头时可以像max-age那样以相对的方式设置日期。
下例中,过时时间被设计为自请求开始的10年以后:
<FilesMatch "\.(gif|jpg|js|css)$"> ExpiresDefault "access plus 10 years" </FilesMatch>
它同时向相应中发送Expires头和Cache-Control max-age头。
Expires: Sun, 16 Oct 2016 05:43:02 GMT Cache-Control: max-age=315360000
因为Cache-Control具备优先权,同时在HTTP1.0浏览器Expires生效。
长久的Expires头应该包含任何不常常变化的组件,包括脚本、样式表和Flash组件。
若是咱们将组件配置为能够由浏览器代理缓存,当这些组件改变时用户如何得到更新呢?当出现了Expires头时,直到过时为止一直会使用缓存的版本。
最有效的解决方案是修改其全部连接,这样,全新的请求将从原始服务器下载最新的内容。一般将版本号嵌在组件的文件名中。
若是没有长久的Expires头,它仍然会存储在浏览器的缓存中。在后续请求中,浏览器会检查缓存并发现组件已通过期。为了提升效率,浏览器会发送一个GET请求。若是组件没有改变,原始服务器能够免于发送整个组件,而是发送一个很小的头,告诉浏览器可使用其缓存的组件。
这些条件请求加起来,就是缓存节省的时间。