一般的网站我们都会使用服务器负载均衡环境来支撑我们的业务,那么,在这个环境下,ETag的相关问题我们就需要单独来讨论一下了。那么,具体的内容还是让我们从文章中来了解一下吧。
在负载均衡环境中(LVS, LoadBalance)为了减少浏览器数据的重复请求操作,一般需要设置 Http Header 的 Etage 和 Expires 告诉浏览器请求数据是否已过期。以下内容主要考虑Apache+squid 环境
ETag Header是文件修改时间、文件大小和inode号生成的校验(checksum),在多台服务器的负载均衡环境下会因部署内容的inode节点差异造成 ETag 的不同,在多台WEB前端做负载均衡的情况下,会因为请求同一个数据但不同机器的 ETag 而影响了响应. 具体表现为用户在第一次请求某一内容时下载而再次时浏览器会发现ETag不同而再次请求下载.。(再次刷新时查看是否响应码为:304)
对于这种负载均衡情况下,Apache可以使用 File Etag 选项配置
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)