`
victorwmh
  • 浏览: 213678 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

服务器网页缓存的深入分析

 
阅读更多

转:http://www.yuanma.org/data/2007/0909/article_2851.htm

 

Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是, HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们 这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。

 

Expires
    Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”
    对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览器接受 到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户端。推 测出的时间一般是接受到响应时间后的三天左右。
    Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_module模块
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00 GMT作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。
可以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是 1970-01- 01 08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。如果在服务器端验证通过,返回304状态,浏览器就还会 使用此缓存。

Cache-Control
    Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate, max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个 Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮 助,但是他们并不能用于替代身
份验证和加密。
     Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应 头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。其中Cache-Control : max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个 delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字 段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control : max-age和Expires值就是一致的。
    如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。

Last-Modified
    Last-Modified和ETag是条件请求(Conditional Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上” ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(NotModify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”LastModified”。
    使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。
一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。
    对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
   无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。

ETag
   既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
    Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。
   FileETag指令配置了当文档是基于一个文件时用以创建 Etag(entity tag)响应头的文件的属性。在Apache 1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。如果一个目录的 配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag -INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
    在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。
 
三种web服务器Header设置内容过期方法

一、Internet 信息服务 (IIS)的内容过期设置
如果IIS 网站中有时间敏感信息,可以配置设置来保证过期信息不被代理服务器或 Web 浏览器缓存。可以配置网站内容,使之在任
何的时间自动过期。当启用内容过期时,Web 浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页
。Microsoft ASP.NET 这样的服务器端技术可用于动态更改提供的内容。通常,时间敏感信息只限于单个文件、目录或网站;不过,您也可以为某台计算机上的所有网站设置内容过期。
必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行 IIS管理器
在命令提示符下,键入 runas /user:administrative_accountname "mmc %systemroot%\system32\inetsrv\iis.msc"。
设置网站内容的过期时间
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。
 
二、APACHE服务的内容过期设置
Apache配置摘录及解释
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”
 
<Directory /data/download>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
ExpiresByType application/x-shockwave-flash A2592000
# application/x-shockwave-flash类型文件的过期设置为“访问后的2592000秒”
</Directory>
上述配置文件中load的两个模块:mod_headers.so  和mod_expires.so 可以让Apache具有对header的一些定制功能。
ExpiresByType:     表示按照文件类型-MIME-TYPE设定过期策略;
A300: 表示在Access后300秒后过期;
ExpiresByType text/css A2592000:    表示Mime type是text/css的文件,在Access后2592000秒过期。
ExpiresDefault A604800:  表示除了单独制定的文件类型等过期策略外的其他内容,按照这个缺省的策略设定:访问后604800秒过期。
 上面的方法可以实现根据web发布的不同文件类型,针对不同的发布目录进行过期策略设置。在按照如上方法设置后,Apache会自动的产生两个相关的http header,举例如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2007 17:44:21 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified: Thu, 25 Jan 2007 07:45:45 GMT
ETag: “72df3a-93-99499c40”
Accept-Ranges: bytes
Content-Length: 147
Cache-Control: max-age=2592000
Expires: Thu, 26 Apr 2007 17:44:21 GMT
Via: CCN-BJ-4-575
Keep-Alive: timeout=60, max=100
Connection: Keep-Alive
Content-Type: image/gif
Length: 147 [image/gif]
  其中:Date + Max-age = Expires.  Max-age是个时间长度,对应web server上面设置的过期时间;Expires是根据max-age算出来的过期时间点,两者是一致的,不同cache在判断内容是否过期时会严格比较 系统时间和上述过期时间,或者比较age(在cache中存住的时间长度)和max-age的值。
 
三、lighttpd
lighttpd默认是没有开启expire模块的,需要我们在使用是手工开启这个模块支持。把mod_expire前面的“#”号去掉。
# vi  /usr/local/lighttpd/etc/lighttpd.conf
                                "mod_expire",

设定过期时间
    * 设定指定url的过期时间:
expire.url = (
       "/images/" => "access 3 hours",
       "/admin/" => "access 3 hours",
       "/area/" => "access 3 hours",
       "/calendar/" => "access 3 hours",
       "/common/" => "access 3 hours",
       "/front/" => "access 3 hours",
       "/inc/" => "access 3 hours",
       "/jeditor/" => "access 3 hours",
       "/js/" => "access 3 hours",
       "/script/" => "access 3 hours",
       "/theme/" => "access 3 hours",
       "/upload/" => "access 3 hours",
       "/view/" => "access 3 hours",
       "/help/" => "access 3 hours",
       "/htm/" => "access 5 minutes"
       )
设置Etag
在配置文件中增加,etag.use-inode="disable"(i节点不参与etag的运算),保证多台服务器生成的Etag值一致。
分享到:
评论

相关推荐

    服务器缓存设置 工具

    在本文中,我们将深入探讨服务器缓存的工作原理、常见类型、设置方法以及如何利用工具优化缓存策略。 一、服务器缓存的工作原理 服务器缓存的基本思想是“存储-转发”,即当请求首次到达时,服务器会将数据保存在...

    web代理服务器缓存设计

    本文将深入探讨Web代理服务器缓存的设计方案,包括其核心技术原理、常用算法策略以及实际应用场景。 #### 二、Web缓存技术的重要性 Web缓存技术的核心目标在于提高网络访问速度,减轻服务器负载,同时减少用户的...

    服务器端流媒体流行性的缓存策略研究.rar

    本文将深入探讨服务器端流媒体流行性缓存策略的研究,旨在揭示如何有效地管理和利用缓存资源,以满足大规模用户的并发需求。 首先,我们要理解“流行性”这一概念。在流媒体领域,流行性指的是某些内容被用户频繁...

    Python-一个采用Python开发的简单缓存服务器

    在IT行业中,Python语言因其简洁明了的语法和丰富的库支持而被广泛应用于各种场景,包括网络服务、数据分析以及我们今天要讨论的主题——缓存服务器的开发。标题中的"Python-一个采用Python开发的简单缓存服务器...

    网页缓存提取器

    下次再次访问相同网页时,浏览器会首先检查这些资源是否在缓存中,如果存在且未过期,就会直接从缓存加载,无需重新从服务器下载,从而加快页面加载速度。 网页缓存的管理遵循HTTP协议中的Cache-Control、ETag、...

    深入分析JavaWeb技术内幕 修订版PDF

    AJAX(Asynchronous JavaScript and XML)技术的使用让Web应用能够实现异步通信,通过JavaScript向服务器发送请求并处理响应,而无需重新加载整个页面。这大大提升了Web应用的用户体验。 知识点七:Web服务 Web服务...

    jQuery缓存性能分析比较案例

    本文将深入探讨jQuery中的缓存性能分析,并通过具体的案例进行比较。 一、jQuery缓存简介 jQuery提供了一个便利的功能,即`$(selector)`,用于选取DOM元素。然而,每次调用此函数都会执行一次DOM查询,这在页面...

    利用javascript缓存页面部件

    本文将深入探讨如何利用JavaScript实现页面部件的缓存策略,以便更好地理解和应用这一技术。 首先,我们要理解缓存的基本概念。缓存是一种存储机制,用于暂时保存经常访问的数据,以便后续快速访问。在Web开发中,...

    20070322--深入挖掘ASP.NET 2.0系列课程(4):数据库的缓存管理与网站页面的缓存管理.pdf

    ### 深入挖掘ASP.NET 2.0:数据库与网站页面缓存管理 #### 影响性能的主要因素分析 在开发与维护基于ASP.NET 2.0的应用时,了解影响性能的关键因素至关重要。主要影响因素包括服务器响应时间过长、网络传输问题...

    网站缓存核心技术

    - **网关/代理服务器缓存**:将网页缓存至网关服务器上,多个用户访问同一页面时,可以由网关服务器直接提供页面,减少了对源服务器的请求。 #### 服务端缓存 服务端缓存则进一步细分为页面缓存、数据缓存和数据库...

    jsp缓存方式

    本文将深入探讨JSP页面中的缓存机制及其配置方法。 #### 一、JSP缓存概述 JSP页面的缓存主要包括两方面:一是服务器端对JSP编译后的Servlet的缓存;二是客户端浏览器对JSP渲染后HTML页面的缓存。这两种缓存方式...

    Oracle 应用服务器 Web 高速缓存 10g

    - **高速缓存**:在 Web 服务器和客户端之间部署的中间层,用于存储经常访问的网页和其他静态内容,以便快速响应重复请求。 - **Web 高速缓存 10g**:Oracle 的特定实现,集成在应用服务器中,支持多种协议,如 ...

    大型WEB网站架构深入分析-图片服务器分离.docx

    【大型WEB网站架构深入分析-图片服务器分离】 大型WEB网站在提供丰富内容的同时,往往需要处理大量的图片数据,这些图片占据了网页传输中的大部分流量,对网站性能的影响显著。因此,图片服务器分离成为优化网站...

    J2EE WEB缓存技术详解.doc

    标题和描述中的“J2EE WEB缓存技术详解”指向了一篇关于在Java Web应用程序中使用缓存技术的深入分析文章。文章由作者夏俊于2011年撰写,主要探讨了在处理大量数据时,如何通过实施缓存策略来优化系统性能,特别是...

    流媒体服务器缓存技术研究-ppt(硕)

    基于这些详实的数据,研究团队不仅验证了算法的有效性,还深入分析了用户访问行为的特征,为后续优化缓存策略提供了宝贵的实证依据。 总之,流媒体服务器缓存技术研究是IT领域的一项重要课题,对于提升VOD和VCR服务...

    禁用缓存整理

    在深入探讨“禁用缓存整理”的主题之前,我们首先需要理解缓存的基本概念及其在IT行业中的重要性。缓存是一种数据存储技术,旨在提高数据的访问速度和应用程序的性能。通过将频繁访问的数据存储在更接近用户或应用...

    浏览器缓存策略Httpwatch

    Httpwatch是一款强大的工具,用于深入分析浏览器缓存的工作情况。 在Web应用程序的层次结构中,缓存可以存在于多个级别,如数据库缓存、持久层缓存(如Hibernate的一级和二级缓存)、业务层缓存以及浏览器缓存。...

    ASP.NET缓存方法分析和实践示例

    本文将深入探讨ASP.NET缓存方法,并通过实践示例来帮助理解其工作原理和应用场景。 一、ASP.NET缓存概述 ASP.NET缓存包括两种主要类型:页面输出缓存和数据缓存。页面输出缓存将整个页面或页面的一部分存储在内存...

    Hsqldb的缓存分析及调试步骤

    通过以上步骤,可以深入了解HSQLDB的内部工作原理,特别是其缓存管理和数据存储机制,从而优化数据库性能,解决潜在问题。在实际应用中,根据需求选择合适的数据表类型,并合理配置缓存,能有效提升HSQLDB的效率。

    大型WEB网站架构深入分析图片服务器分离.docx

    【大型WEB网站架构深入分析图片服务器分离】 在构建大型Web网站时,图片服务器分离是一个重要的设计决策,旨在优化性能、提高稳定性和可扩展性。图片服务器的分离将图片的存储和传输从主Web服务器中独立出来,从而...

Global site tag (gtag.js) - Google Analytics