`
tiandirensoon
  • 浏览: 598268 次
文章分类
社区版块
存档分类
最新评论

负载均衡环境中和如何设置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的值是缓存服务器算出来的,原始服务器是没有的.

分享到:
评论

相关推荐

    Etag和Expires.docx

    Etag和Expires.docx

    Etag和Expires 性能调优

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

    redis 对hash设置expires.rar

    redis 对hash设置expires.rar

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

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

    Laravel开发-expires

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

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

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

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

    代码如下: function ClearCookie() { var expires = new Date(); expires.setTime... //expires是对应过期时间的设置,不设这个值,cookie默认在关闭浏览器时失效 [removed] = “roleID=’333”’;path=/;expires=”

    nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

    Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现...

    开涛高可用高并发-亿级流量核心技术

    2 负载均衡与反向代理 18 2.1 upstream配置 20 2.2 负载均衡算法 21 2.3 失败重试 23 2.4 健康检查 24 2.4.1 TCP心跳检查 24 2.4.2 HTTP心跳检查 25 2.5 其他配置 25 2.5.1 域名上游服务器 25 2.5.2 备份上游服务器 ...

    设置cooke和获取cooke的JS函数

    function setCookie(name, value, expires, path, domain, secure) { var today = new Date(); var expiry = new Date(today.getTime() + 7 * 24 * 60 * 60 * 1000); if(expires==''||expires==null) { ...

    nginx基础实例培训视频.zip

    14-expires缓存提升网站负载 15-反向代理实现nginx+apache动静分离 16-nginx实现负载均衡 17-nginx连接memcached 18-第3方模块编译及一致性哈希应用 19-大访问量优化整体思路 20-ab压力测试及nginx性能统计模块 21-...

    浏览器缓存技术介绍以及优化建议

    通过设置HTTP响应头,如`Expires`和`Cache-Control`,可以控制资源的缓存策略。强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器...

    浏览器之HTTP缓存的那些事

    浏览器之HTTP缓存的那些事 什么是浏览器缓存 浏览器HTTP执行机制 缓存模式 缓存相关的Http Header Cache-Control Expires Last-Modified ETag

    nginx expires控制页面缓存

    语法:expires [time|epoch|max|pff]默认值:offexpires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用time:可以使用正数或负数。“Expires”头标的值将通过当前系统...

    Nginx 常见应用技术指南

    一、 Nginx 基础知识 二、 Nginx 安装及调试 ...十二、 Nginx负载均衡 十三、 Nginx简单优化 十四、 如何构建高性能的LEMP环境 十五、 Nginx服务监控 十六、 常见问题与错误处理. 十七、 相关资源下载

    Nginx中文手册下载

    目 录 一、 Nginx 基础知识 二、 Nginx 安装及调试...十二、 Nginx 负载均衡 十三、 Nginx 简单优化 十四、 如何构建高性能的 LEMP 环境 十五、 Nginx 服务监控 十六、 常见问题与错误处理. 十七、 相关资源下载

    nginx 1.9 window 版本

    #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; #工作模式及连接数上限 events { use epoll; #epoll是多路复用...

    ASP网站后台美佳培训ppt(含联系代码)

    该属性指定页面输出时是否需要缓存区,如果该属性被设置为 True 缓存文件不会被发送到客户端,直到所有的asp脚本被处理,以及调用Flush或end 方法为止 response. buffer=true 配合response. flush或response. end...

Global site tag (gtag.js) - Google Analytics