学习:应用程序(jsp)->Web容器(Apache)->缓存服务器(Squid)对缓存的控制

2009-12-05 by Jinyang | Filed under 技术相关.

最近一直在学习优化Squid缓存,看了不少基础知识。好多内容其实都是车东老师(www.chedong.com)多年前的杰作。(同时感谢 张宴:blog.s135.com ; 扶凯:www.php-oa.com)

因为系统早期没考虑什么缓存和优化,后来我又是直接部署使用了Squid,所以实际是Squid只是稍微缓存了一点内容更多的作用等于前端起了一个代理的作用(在前端限制了半连接攻击、迅雷等 作用也挺明显的)。

就缓存的不同层次,

1. Web容器 定义默认的缓存机制 只要是对图片、CSS等不方便自身显式控制缓存策略的内容指定出默认的缓存策略机制
2. 应用程序层 控制内容的缓存策略,如验证码等动态输出的是不应被缓存的,新闻等则应该被缓存;
3. Squid缓存服务层 按Web容器和应用程序的设定管理缓存内容并提供高效、高可靠的响应

记录下自己当前的设定以备改进(都是参考各位老师的blog结合自己的需求设定的,每个系统都有自己独特的需求):

1. Apache mod_gzip、mod_expires、mod_headers 设定 :
#gzip lijinyang 20091117
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_minimum_file_size 1000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.jsp$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
# mod_gzip的临时工作目录: mkdir /tmp/mod_gzip;  chmod -R 777  /tmp/mod_gzip
mod_gzip_temp_dir /tmp/mod_gzip
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
</IfModule>


#mod_expires lijinyang 20091127
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/gif "access plus 5 day"
 ExpiresByType image/png "access plus 5 day"
 ExpiresByType image/jpeg "access plus 5 day"
 ExpiresByType text/javascript "access plus 5 day" 
    ExpiresByType text/css "now plus 5 day"
 ExpiresByType image/x-icon "now plus 15 day"
 
    ExpiresDefault "now plus 1 day"
</IfModule>

#mod_headers lijinyang 20091127
<IfModule mod_headers.c>
     # 5 day
 <FilesMatch "\.(flv|gif|ico|jpg|jpeg)$">
  #Header set Cache-Control "public,max-age=432000"
  Header append Cache-Control "public"
  Header set X-Powered-By "
qh@ist.cn"
  Header set Server "QFE/1.0"
 </FilesMatch>

 # 5 day
 <FilesMatch "\.(pdf|swf|js|css)$">
  #Header set Cache-Control "public,max-age=432000"
  Header append Cache-Control "public"
  Header set X-Powered-By "
qh@ist.cn"
  Header set Server "QFE/1.0
 </FilesMatch>
 
 # 1 day
 <FilesMatch "\.(htm|html|jsp|mht)$">
  #Header set Cache-Control "public,max-age=86400"
  Header append Cache-Control "public"
  Header set X-Powered-By "
qh@ist.cn
"
  Header set Server "QFE/1.0"
 </FilesMatch> 
</IfModule>

官方文档有指出 mod_headers 是不可以直接修改 Date、Server两个参数的。

2. JSP缓存设定:
//设置不缓存
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate");
response.setDateHeader("Expires",-1);

因为默认的是把内容都做了缓存了的,所以只需要在不可以被缓存的页面做下设定即可,在应用中做的设置是会覆盖掉web容器apache层面的设定的。

3. Squid 设定
squid不在单独的是设置缓存规则。只是定义下可缓存对象的大小 文件夹等,不过返给浏览器的header需要稍微改动下以达到安全+有效的目的:
#不返回客户端squid版本信息
via off
reply_header_access Server deny all
reply_header_access Warning deny all
reply_header_access P
roxy-Connection deny all
reply_header_access X-Cache-Lookup deny all
#返回一个X-Cache信息
reply_header_access X-Cache allow all
reply_header_access Expires allow all
reply_header_access Cache-Control allow all
reply_header_access age allow all

合理的设置的表现在于看到数据和效果后都感觉是透明有数的(页面第一次访问未命中缓存的,第二次就应该命中,此前对各层设置并不理解,总是在猜测,其实对任何系统都应该深入理解而不能全靠猜测),现在94%的流量都是缓存在承担(请求只有60%多,使用axaj较多)

虽然Apache 1.3应该用的人越来越少了,不过大体的原理都是相通的。系统比较稳定 还真的没计划升级Apache版本。


Tags:

发表评论

您的电子邮箱不会被公开。 标记为 * 的区域必须填写

返回顶部