当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    IIS的内容缓存过期机制实践 有效提高站点性能

    栏目:win服务器问题汇总 时间:2019-02-22 10:44

    目前,随着网页内容越来越绚烂,访问速度却令人越来越不满。实践证明,正确设置Http Response Header中的Expires头将有助于提高网页访问速度 我们的网站中往往包含大量的页面组件,比如图片、样式表文件、JS脚本文件和Flash动画。这些组件的变化频率非常低,尤其是那些构成网站基本框架的组件,

    几乎不会发生变化。我们可以将这些变化率很低的组件看作静态内容,利用IIS的内容过期机制和浏览器的本地缓存机制将它们在访问者的电脑硬盘中保存一段时间。

    当访问者访问你的网站时,如果这些存在本地的静态内容没有过期,浏览器会从本地硬盘中装载,而不去向服务器发出请求。

    如果你使用Fiddler这样的工具跟踪网页访问,你会清楚地看到虽然只是访问一个页面,但是发出的Http请求和应答却不止一个。网页中的每张图片,每个

    JS脚本文件,每个CSS文件,都会引发一次请求和应答。因此如果想让网页的访问速度快起来,减少Http的请求数量,降低从服务器下载内容的次数是有效途径。

    而使用了内容过期机制后可以就实现这样的目的,这就是使用内容过期机制的意义。

    大多数的Web开发者都玩过IIS 6或IIS 7,但是又有多少人仔细观察过HTTP Headers或HTTP Response Headers标签中的内容呢?此处我以IIS 6 为例,

    默认情况下此标签中的界面如下图:

    此时,如果向该网站的一个网页发出请求,该网页中包含了一张图片的链接,那么在获取到该网页的HTML文档之后,浏览器会继续对这张图片发出请求,该请求的响应在Http Response Header中如下表达:

    HTTP/1.1 200 ok (表示服务器找到了此图片并正确响应)

    Date:Thu, 04 Feb 2010 08:25:38 GMT (响应的时间,格林尼治时间)

    Last-Modified:Wed, 03 Jan 2009 01:55:06 GMT(图片最后被修改的时间,格林尼治时间)

    这张图片会被浏览器保存在本地硬盘的IE临时文件夹中。使用同一个浏览器窗口在同一个会话中再次访问到这个页面,
    则页面中的组件都不再重新请求。

    当在这台机器上打开另一个浏览器窗口(另一个会话)又一次访问此页面时,由于这张图已经在本地保存了,但是浏览器
    刚才的响应中并没有规定内容的过期机制,因此浏览器仍会向服务器发出一次请求:
    If-Modified-Since: Wed, 03 Jan 2009 01:55:06 GMT (询问服务器,我本地这张图片的最后修改时间是这个,在此时间之后你那有没有更新的版本?)
    If-None-Matched: "abdkfkdkdkdjkjkfkfd" (这是一段ETag编码,是服务器端给该组件的唯一标示)

    服务器收到请求后检查被请求的图片,发现它的最近修改时间还是Wed, 03 Jan 2009 01:55:06 GMT ,于是响应请求:
    HTTP/1.1 304 Not Modified (请求的图片找到了,并且没有被改变过)

    Date:Thu, 04 Feb 2010 08:25:38 GMT (响应的时间)
    浏览器收到这个响应就知道它可以放心地使用本地存储的这张图片了,不必再从服务器重新下载该组件。

    由此可见,IIS Http Headers标签的默认设置是不禁止浏览器缓存的,但是也没有告诉组件保存过期的时间,因此浏览器将组件保存在本地后,
    每次访问都会询问服务器此组件是否过期,如果没过期则使用本地保存的内容,否则从服务器下载内容。 可以看出它只减少了从服务器下载内容的次数,
    并没有减少向服务器发出请求的次数,请求和响应依然耗费了时间。

    在IIS中定位到网站存放图片的文件夹,然后打开属性窗口,在HTTP Headers中做出如下选择,要求组件的过期时间为本次请求后1天,也就是在本地缓存86400秒。