`
evan1234
  • 浏览: 30577 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet/JSP如何控制页面缓存于squid中

阅读更多

     近段时间在研究如何将Servlet/JSP中的伪动态页面缓存到Squid中来加速Web访问,在google上搜索"JSP在squid中的缓存"的信息,出来的信息比较少,后来差PHP,ASP的缓存相关资料及"深入体验JAVA Web开发内幕——核心基础.pdf"和"Squid中文权威指南"中的相关章节,总算实现了这个目的(有需要这两本书的兄弟可以mail我 )。基于自己的一些理解和试验成果,记下来供以后参考。

 

      HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)在中间缓存服务器中的缓存情况。

 

 

      HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。

 

      HTTP1.0中通过Pragma 控制页面缓存,可以设置:Pragma或no-cache。网上有非常多的文章说明如何控制不让浏览器或中间缓存服务器缓存页面,通常设置的值为no-cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为Pragma。

 

      HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

  • no-cache,浏览器和缓存服务器都不应该缓存页面信息;
  • public,浏览器和缓存服务器都可以缓存页面信息;
  • no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
  • must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
  • max-age=xxx,s-max-age=xxx,替代Expires,表示应该在xxx秒后认为页面过时,后者指示代理服务器中缓存(通常称为共享缓存)的页面过期时间。(不过我试了好多次,这个选项一直没法实现,希望有人能补充!)

       通常我们不需要缓存页面时设置该值为"no-cache,no-store,must-revalidate"(分三行代码设置);需要缓存页面信息时则设置该值为"public,max-age,s-max-age"。

 

       Last-Modified只页面的最后生成时间,GMT格式;

       Expires过时期限值,GMT格式,指浏览器或缓存服务器在该时间点后必须从真正的服务器中获取新的页面信息;

       上面两个值在JSP中设置值为字符型的GMT格式,无法生效,设置long类型才生效;

 

       最后来看一下JSP或Servlet中如何设置缓存控制信息的代码:

   //本页面允许在浏览器端或缓存服务器中缓存,时限为10秒。
   java.util.Date date = new java.util.Date();
   response.setDateHeader("Last-Modified",date.getTime());
   response.setDateHeader("Expires",date.getTime()+10000);

   response.setHeader("Cache-Control", "public");
   response.setHeader("Pragma", "Pragma");
 
   //不允许浏览器端或缓存服务器缓存当前页面信息。
   response.setHeader( "Pragma", "no-cache" );
   response.setDateHeader("Expires", 0);

   response.addHeader( "Cache-Control", "no-cache" );
   response.addHeader( "Cache-Control", "no-store" );
   response.addHeader( "Cache-Control", "must-revalidate" );
 

       如果HTML页面信息中包括了Expires头信息,则其相关的缓存机制不再处理该页面,而是安装页面的缓存控制要求来处理。所以做了上述工作后,Squid无需做任何配置上的修改(指Squid的refresh_pattern指令不处理这些页面 )。

 

 

       下面说一下Squid缓存一些静态资源的一些原理,Squid通过refresh_pattern指令来控制用户请求是否命中。

       "Squid中文权威指南"文章中描述Squid的refresh_pattern指令一段文章读起来非常的拗口,就是LM_factor比率的算法,这个算法的概念翻译的比较模糊,网络上传来传去的,感觉都是搞不清楚,后来参考"OReilly - Squid The Definitive Guide.chm"英文原文,总算明白过来

Responses that fall between the minimum and maximum are subject to Squid's 
last-modified factor  (LM-factor) algorithm. For such responses, Squid calculates
the response age and the LM-factor and compares it to the percent value. The 
response age is simply the amount of time passed since the origin server 
generated, or last validated, the response. The resource age is the difference 
between the Last-Modified and Date headers. The LM-factor is the ratio of the
response age to the resource age.

LM-factor的定义是(response age)/(the resource age).
其中response age是指HTTP头信息中的age信息。
resource age是指HTTP头信息中的Date值减去Last-Modified的值转化为秒的值。

各位可以通过curl命令(Linux下自带命令)来参看一个资源返回回来的HTTP头详细信息,如下面这样:
curl -I http://10.0.85.125:8384/mailproxy/welcome.htm
 

     经过试验,这个算法是正确的,同时这里要提醒一下,特别是对一些HTML类型的资源,max值不要设置的太大,如果设置的太大的话,有可能修改的文档信息需要非常长的时间才能得到更新,因为LM-factor参数值是变化的,越来越大,分母变大的结果就是比率越来越小,总是小于我们设定的比率,导致需要max来控制页面刷新。

分享到:
评论
3 楼 bushuang 2009-06-26  
同2楼问,squid应用场景是怎么样的?例如博客能不能适用
2 楼 robinqu 2009-06-10  
如果页面上针对某个用户的特定内容,应该怎么搞缓存?
1 楼 jinkam 2009-01-03  
Good,请继续努力 

相关推荐

    squid缓存服务器的研究

    - **访问日志文件**:`access_log /var/log/squid/access.log`,指定 Squid 访问日志的存储位置。 - **可见主机名**:`visible_hostname proxy.test.com`,设置 Squid 对外显示的主机名。 - **缓存目录设置**:`...

    squid编译安装及配置详解.pdf

    3. 配置 squid.conf 文件:在 /usr/local/squid/etc 目录下添加一条记录 “visible_hostname 主机名”,例如在 squid.conf 文件中添加 “visible_hostname localhost”。 4. 测试 squid.conf 文件:使用 squid 命令...

    squid 配置缓存服务器

    默认情况下,访问日志位于 `/var/log/squid/access.log`,可以自定义格式: ```conf access_log /var/log/squid/access.log squid ``` ### 3. 启动与守护进程配置 安装完成后,启动 Squid 服务: ```bash sudo ...

    squid缓存服务器的配置

    安装完成后,主要配置文件位于`/etc/squid/squid.conf`。最基础的配置涉及开放所有请求: ```conf http_access allow all ``` 此行代码需替换原始配置中的`http_access deny all`。接下来,启动Squid服务: ```...

    squid代理中出现的错误

    2. **查看 Squid 输出的日志文件**:检查 `/var/log/squid/squid.out` 文件,了解具体的错误信息和原因。 3. **手动启动 Squid**:如果服务脚本存在问题,可以尝试手动启动 Squid,排除脚本问题。 ```shell /usr/...

    AIX成功配置SQUID

    在IBM AIX操作系统上配置SQUID代理服务器是...在遇到问题时,检查`/usr/local/squid/var/log/cache.log`中的错误日志是解决问题的关键。通过遵循上述步骤并参考示例配置,你应该能够建立一个稳定运行的SQUID代理服务。

    CentOS 32位搭建squid http代理,解决TCP_MISS/503

    主要的配置文件是`squid.conf`,在CentOS中通常位于`/etc/squid/`目录下。这个文件包含了Squid的所有设置,如监听端口、访问控制、缓存策略等。为了搭建一个基本的HTTP代理服务器,你需要编辑`squid.conf`,找到或...

    Squid web缓存技术

    Squid是一个开源的代理服务器和缓存系统,广泛应用于企业和大型网络环境中。 1. **Web缓存** Web缓存通过在本地存储经常访问的HTTP资源来提高网络性能。当用户请求某一网页或其他HTTP对象时,Squid首先检查其缓存...

    缓存代理服务器Squid-教程

    Squid是一个高性能的代理缓冲服务器,也许你已经用过Windows平台下的WinGate,MS Proxy Server等功能类似的产品。Squid是一个应用级代理,在保证客户端主机和服务器主机网络连通后,需要客户端软件做相应的设置后...

    squid中文权威指南

    在这个文件中,你可以设置服务器的监听端口、缓存目录、访问控制策略等。例如,以下配置将 Squid 代理服务设置在端口 3128: ```conf http_port 3128 ``` **Squid 缓存配置** 缓存管理是 Squid 的核心功能。你...

    官方原始配置文件 : /etc/squid/squid.conf

    官方原始配置文件 : /etc/squid/squid.conf ubuntu 22.04 apt install squid

    Squid中文权威指南 最好的Squid指南

    Squid提供了多种缓存策略,如基于内容类型、URL路径、域名的缓存策略,以及TTL(Time To Live)设置,以控制缓存资源的有效期限。同时,Squid还支持自动清理过期和无用的缓存文件,保持存储空间的合理利用。 Squid...

    Squid for windows 反向代理缓存服务器配置软件

    Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该...

    squid安装配置步骤

    Squid是一个强大的开源HTTP代理服务器和缓存系统,广泛应用于Linux系统中,用于提高网络访问速度、降低服务器负载,并实现网络访问控制。在Linux环境下安装配置Squid,可以按照以下步骤进行: 1. **获取Squid软件包...

    Centos中Squid代理服务器安装和基本设置(含反向代理)

    FATAL: Cannot open '/usr/local/squid/var/logs/access.log' for writing. touch /usr/local/squid/var/logs/access.log chmod a+w /usr/local/squid/var/logs/access.log /usr/local/squid/sbin/squid -k ...

    squid缓存详细配置

    文档为squid缓存服务的配置文档,系统为CentOS部署,本人自己部署成功后整理的文档,绝对清晰。

    squid 多ip出口认证

    在Linux环境下,Squid作为一款高性能的代理缓存服务器,广泛应用于企业级网络环境中,以提高数据传输效率及安全性。本文将详细介绍如何在Linux下配置Squid实现多IP出口认证,包括安装、配置及启动过程。 #### 二、...

    Squid 代理服务器.ppt

    - **日志记录**:配置访问日志和缓存日志,如`cache_access_log /var/log/squid/access.log`和`cache_log /var/log/squid/cache.log`。 - **其他配置**:设置网页缓存日志、主机名、管理员邮箱,以及定义和控制访问...

    web 缓存技术 squid

    web 缓存技术squid ,chm格式,英文文档

Global site tag (gtag.js) - Google Analytics