`

负载均衡环境中和如何设置Expires和Etag .

阅读更多

在负载均衡环境中(LVS, LoadBalance)为了减少浏览器数据的重复请求操作,一般需要设置 Http Header 的 Etage 和 Expires 告诉浏览器请求数据是否已过期。以下内容主要考虑Apache+squid 环境

ETag Header是文件修改时间、文件大小和inode号生成的校验(checksum),在多台服务器的负载均衡环境下会因部署内容的inode节点差异造成 ETag 的不同,在多台WEB前端做负载均衡的情况下,会因为请求同一个数据但不同机器的 ETag 而影响了响应. 具体表现为用户在第一次请求某一内容时下载而再次时浏览器会发现ETag不同而再次请求下载.。(再次刷新时查看是否响应码为:304)
对于Apache 可以使用 FileEtag 选项配置
Apache 的默认ETag的值总是由文件的索引节点(Inode)、大小(Size)、最后修改时间(MTime)决定
这里我们只需要去掉Inode即可
FileETag MTime Size
具体关于 FileETag 详细内容可以查看Apache官方文档

Expires用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。
可以使用Apache的mod_expires 模块来设置,这包括控制应答时的Expires头内容和Cache-Control头的max-age指令

ExpiresActive On
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/jpeg “access plus 1 month”
ExpiresByType image/x-icon “access plus 1 month”
ExpiresByType image/png “access plus 1 month”
ExpiresByType text/html “access plus 30 minutes”
ExpiresByType text/css “access plus 30 minutes”
ExpiresByType text/js “access plus 30 minutes”
ExpiresByType application/x-javascript “access plus 30 minutes”
ExpiresByType application/x-shockwave-flash “access plus 30 minutes”

以上设置为 图片文件的有效期为从请求文件开始1个月,html,css,js,flash文件的有效期为从请求文件开始30分钟
这里只是一个常规设置,Apache官方文档 对此设置有详细介绍
当设置了expires后,会自动输出Cache-Control 的max-age 信息,这个数值是expires有效期内的秒数,(一个月的数值为2592000) 在这个时间段里,该文件的请求都将直接通过缓存服务器获取,当然如果需要忽略浏览器的刷新请求(F5),缓存服务器squid还需要使用refresh_pattern 选项来忽略该请求

refresh_pattern -i .jpg 1440 50% 10080 reload-into-ims ignore-reload ignore-no-cache ignore-private

以下为实际输出的HTTP Header信息
Date Thu, 07 Aug 2008 07:27:57 GMT
Server Apache
Last-Modified Fri, 27 Jun 2008 07:18:52 GMT
Etag “df6-b8c8cf00″
Accept-Ranges bytes
Content-Length 3574
Cache-Control max-age=2592000
Expires Sat, 06 Sep 2008 07:27:57 GMT
Content-Type image/jpeg
Age 34241
X-Cache HIT from s1.ihompy.com
Connection keep-alive

对于动态页面的缓存如果不是频繁更新的页面数据,可以在squid缓存,只需要注意两点
1. session : 对于需要缓存的数据,一定要关闭session防止在http header 中包括session id 字段
2. Last-Modified 和 Expires 标记: 一般般纯静态页面本身都会有Last-Modified信息,这是由WEB服务器获取文件的最后修改时间生成的,而动态页面需要默认的输出内容是

Date Thu, 07 Aug 2008 16:58:37 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Last-Modified Thu, 07 Aug 2008 16:58:37 GMT
这里的 Last-Modified 时间和请求文件的时间相同,也就是说该文件总是声明为最新的
在程序中需要输出Last-Modifed 和 Expires信息,比如php
header(‘Last-Modified: ‘ . gmdate(“D, d M Y H:i:s”) . ‘ GMT’);
header(‘Expires: ‘ . gmdate (“D, d M Y H:i:s”, time() + 3600*24). ” GMT”);

以上信息设置php文件的过期时间为请求该文件的时间后的24小时(3600*24)

Squid和Apache中的max-age与Expires的分别

主要重点在于我们要明白一个相对(Expires)一个绝对(max-age).

分别

max-age
max-age是HTTP/1.1中,他是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对的值,相对Request_time(请求时间).
例如:A.html 用户请求时间是18:00,max-age设置的是600的话,相当18:00+600秒过期,也就是相对18:00的时间后面600秒后过期.默认的max-age是由Expires算出来的.

Expires
Expires是HTTP/1.0中的,它比max-age要麻烦点.Expires指定的时间分下面二种,这个主要考虑到apache中设置是A还是M.

1.相对文件的最后访问时间(Atime)
当Apache使用A时间来做Expires时.这样设置时.他就和max-age的值相等,因为max-age是相对文件的请求时间(Atime).

例如:ExpiresByType text/html A600

由上面我们得知,Apache设置Atime时,过期为600秒时.
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires=max-age

2.绝对修改时间(MTime)
这又分二种情况,我们来拿A.htm来讲
假设文件的建立时间为18:00.

当用户Request请求为18:00时,过期为600秒
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires等于max-age

当用户Request请求为18:20时,过期为600秒

Expires=18:00+600=18:10(因为设置成Mtime时,时间由文件建立时间来决定)
max-age=18:20+600=18:30
得出:Expires不等于max-age

另外要注意,象上面这种清况时,max-age优化,所以过期时间为18:30.

在squid,如果没有指明expires和max-age这二个的截止时间,那它就会使用发式截止时间,如参考 Last-Modified.
其实上面的max-age=18:20+600=18:30,这样算max-age不对,真实环境要这样算,max-age过期为http头中的Age=600过期.
注:Age域值是缓存服务器估计从响应产生或被原始服务器重新证实以来的总时间.age的值是缓存服务器算出来的,原始服务器是没有的.

http://hi.baidu.com/lijunwyf/blog/item/f109aa00ed122f19728da54e.html

分享到:
评论

相关推荐

    Etag和Expires.docx

    Etag和Expires.docx

    apache提示没有设置 max-age or expires解决办法.docx

    apache提示没有设置 max-age or expires解决办法.docx

    redis 对hash设置expires.rar

    redis 对hash设置expires.rar

    Etag和Expires 性能调优

    本文对页面中Etag和Expires标识处理,使得页面更加有效被Cache

    C#.net与vb.net中读写Cookie的方法

    //如果不设置失效时间,Cookie信息不会写到用户硬盘,浏览器关闭将会丢弃。 创建Cookie方法 (2) HttpCookie aCookie = new HttpCookie(“lastVisit”); //上一次访问时间 aCookie.Value = DateTime.Now.ToString(); ...

    RemETag_去除iis的etag_配置ETag_iis性能优化

    Etags原理:Add an Expires header已经对浏览器缓存机制中的Cache-Control和Expires进行了配置,这一条评测的是另外两个:Last-Modified和ETag。简单的说,即使设置了文件的期限,浏览器在访问资源时也会因为Last-...

    js设置cookie过期及清除浏览器对应名称的cookie

    expires.setTime(expires.getTime() – 1000); //当前时间减去一秒,相当于立即过期(可以增减) [removed] = “appCode=’222”’;path=/;expires=” + expires.toGMTString() + “”; //expires是对应过期时间的设置...

    c# .net在WEB页中的COOKIES设置技巧

    一、设置cookies的方法很简单,有以下两种方法: 1、直接添加Cookie值: Response.Cookies[“userName”] = “Tom”; Response.Cookies[“userName”].Expires = DateTime.Now.AddDays(1) ; \\过期时间,在Cookies...

    Laravel开发-expires

    Laravel开发-expires 设置数据库记录的过期日期,如将来在列中删除的日期

    c#和net存取cookies操作示例

    Response.Cookies[“username”].Expires=DateTime.Now.AddDays(1); 方法2: 代码如下:System.Web.HttpCookie newcookie=new HttpCookie(“username”);newcookie.Value=”oneday”;newcookie.Expires=DateTime.Now....

    .net中的session与cookies区别及使用方法

    以上就是分别对两个COOKIES变量赋了两个不同的传,那么在使用COOKIES时,我们怎样来控制COOKIES的有效期呢,看下面: 代码如下:Response.Cookies[“uid”].Expires = DateTime.Now.AddDays(1); Response.Cookies[...

    uwsgi-router-expires-2.0.18-4.el8.aarch64.rpm

    离线安装包,亲测可用

    asp.net COOKIES需要注意的一点

    由于COOKIES的设置简单,使用起来也很方便,因此,平时直接读写COOKIE的过程中并没有发现COOKIE的Expires问题。 当从 REQUEST获取一个COOKIES实例后,如果不重新设置Expires的情况下再次将COOKIES发送到客户端,...

    uwsgi-router-expires-2.0.16-1.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    JSQLConnect.jar

    JSQLConnect.jarJSQLConnect.jarJSQLConnect.jarJSQLConnect.jar

    Redis 3.0 中文版 - v1.1.pdf

    Redis 过期 (expires):有限生存时间的键. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 第 4 章从入门到精通(中) . . . . . . . . . . . . . . . . . . . . . . . . . . . ....

    jquery.cookie.js

    $.cookie('the_cookie', 'the_value', { expires: 7 }); //设置带时间的cookie $.cookie('the_cookie', '', { expires: -1 }); // 删除 $.cookie('the_cookie', null); // 删除 cookie $.cookie('the_cookie', 'the_...

    SIP rfc3261 协议下载

    SIP 协议 会话初始协议 很有帮助 Contents 1 Introduction 9 2 Overview of SIP Functionality 10 3 Terminology 11 4 Overview of Operation 11 5 Structure of the Protocol 16 6 Definitions ...

    jquery.i18n.properties和jquery.easyui.min

    expires : 7 }); }; } else{ console.log("not navigator"); return false; } } } var execI18n = function(){ //获取网站语言(i18nLanguage,默认为中文简体) getWebLanguage(); //国际化...

Global site tag (gtag.js) - Google Analytics