`
CshBBrain
  • 浏览: 658028 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:146508
Group-logo
HTML5移动开发
浏览量:139534
社区版块
存档分类
最新评论

学习CDN不得不读之-服务器网页缓存的深入分析

 
阅读更多

 

载自:http://www.php-oa.com

 

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值一致.

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

分享到:
评论

相关推荐

    如何搭建自己CDN服务器(LuManager)

    如何搭建自己CDN服务器 目前在免费CDN市场上,360因为“免费”而越做越大,加速乐做的很早。但因免费的节点不多,好多用户都被强走了。安全宝现在也还不错。目前国内的免费CDN市场已呈现三足鼎立趋势。 可为什么我...

    aws CDN刷新缓存

    本脚本用于清除AWS上的CDN(即cloudfront)的缓存 使CDN缓存过期,重新回源拉去

    兄弟 DCP-9020CDN MFC-9140CDN-9340CDW 维修手册.pdf

    本文档是一份关于兄弟(Brother)品牌的彩色激光多功能设备的维修手册,涵盖的机型包括DCP-9020CDN、MFC-9140CDN以及MFC-9340CDW。手册中除了提供常规的维修步骤和指导外,还涉及了定影清零等特定维修操作。 2. ...

    阿里云CDN服务-API手册-D.docx

    阿里云CDN服务-API手册-D 本文档介绍了阿里云CDN服务的API手册,旨在帮助用户快速入门使用CDN服务。CDN服务提供了内容分发网络,用户可以使用本文档介绍的API对CDN服务进行相关操作。 CDN API概述 CDN API提供了...

    360前端cdn公共js库e-z

    幸好我写得一手好爬虫,2016年爬取了360前端js库代码共821MB。自libs.useso.com CDN镜像关闭之后,360前端cdn公共js库a-d和360前端cdn公共js库e-z这两部分便作为私服前端库。

    服务器缓存设置 工具

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

    yandex-cdn:grunt-google-cdn 和 gulp-google-cdn 插件。 替换对 Yandex CDN 资源的引用

    yandex-cdn 这是 grunt-google-cdn 和 gulp-google-cdn 的插件,用于替换上资源的引用。 支持的库(所有最新版本):首先执行npm install --save-dev yandex-cdn 。如何与 gulp-google-cdn 一起使用只需将此模块传递...

    Zblog 的CDNfly-CloudFlare全能CDN自动刷新缓存插件-自动清理-适配优化2.1.0版本

    Zblog 的CDNfly|CloudFlare全能CDN自动刷新缓存插件,包括其自动清理、适配优化和缓存配置,手动刷新,全站刷新,自动预热等功能。作者之前已写过Wordpress对接cdnfly的插件,而此次是应群友要求为Zblog打造相应插件

    CDN学习资料

    5. **内容提供**:用户向指定的CDN节点请求网站内容,节点上的高速缓存服务器负责将请求的内容提供给用户。 #### 三、CDN加速机制 - **缓存技术**:通过将网站的文字、图片、视频等静态资源缓存到全球分布的节点...

    阿里云CDN服务-产品简介-D.docx

    阿里云CDN(内容分发网络)是一种高效的内容传输服务,旨在通过遍布全球的边缘节点服务器群,替代传统的中心化WEB Server数据传输模式,以优化用户访问速度和降低网络拥塞。该服务采用智能对象热度算法,实现资源的...

    缓存工作原理(CDN).pdf

    CDN的核心优势在于其利用边缘服务器缓存内容,这些边缘服务器位于靠近最终用户的位置,即入网点(POP)。这种设计可以最大程度地降低延迟,提高内容的获取速度,从而为最终用户带来更好的性能和更佳的用户体验。 ...

    镜像CDN-Layer-master

    镜像CDN(Content Delivery Network)是一种分布式网络服务,它通过将网站内容缓存到全球各地的服务器上,以提高用户访问速度和降低源站压力。"Layer-master"项目可能是用于构建自定义CDN解决方案的一个开源框架或...

    阿里云CDN服务-用户指南-D.docx

    阿里云CDN服务-用户指南-D.docx

    阿里云CDN服务-CLI手册-D.docx

    阿里云CDN服务-CLI手册-D.docx

    一秒延时直播CDN+P2P服务分析-

    云帆加速的P2P技术是基于大数据分析的领先方案,通过服务器对码率、帧率等进行分析,能够提前80%发现并解决问题。其P2P+CDN融合技术使得P2P用户数量得到优化,保障了95%以上的流畅度,并且能够实现700ms以下的低延时...

    360前端cdn公共js库a-d

    幸好我写得一手好爬虫,2016年爬取了360前端js库代码共821MB。自libs.useso.com CDN镜像关闭之后,360前端cdn公共js库a-d和360前端cdn公共js库e-z这两部分便作为私服前端库。

    easy-cdn-1.0.5-linux.tar.gz

    在“easy-cdn-1.0.5-linux.tar.gz”这个压缩包中,可能包含了一个开源的CDN解决方案,适用于Linux系统。 1. CDN基本原理:CDN的核心是内容分发,通过智能DNS解析系统将用户的请求导向最近的缓存节点。当用户请求...

Global site tag (gtag.js) - Google Analytics