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

2009-12-05 by Jinyang | No Comments | Filed in 技术相关

最近一直在学习优化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:

使用Google Analytics的Custom Alert功能实现自定义流量监控服务

2009-12-03 by Jinyang | No Comments | Filed in 技术相关

因为Google Analytics不是实时的,加之可能因为被墙什么的出现流量统计丢失的问题,所以虽然同时使用了Google和CNZZ的服务,平时还是以看CNZZ的服务为主,CNZZ的在线详情挺实用。
之前雅虎统计是有流量报警功能的,只是好像太容易被太触发了,搞的邮箱一堆邮件,后来换成了量子统计因为考虑CNZZ拿了风投更靠谱些就替换掉了它。

CNZZ的报警服务是收费的,国庆时虽然很想启用,并且不支持电信手机,也就没用起来。

Google现在的Alert,看上去除了当前最小时间粒度暂时还是天外,各方面的灵活性还是很强大的。

 (图片仅供参考,与任何公司无关)

先定义了一个PV降低30%时的通知,希望Google进一步提升服务把时间粒度变的更细小些、过滤条件可以添加多个(这些会作为收费的特性吗?)。
Gmail一直都启用了转发到139和189邮箱,这样网站有些异常就容易及时发现(现在以天为单位的粒度肯定是不满足生产需求的)。

Tags:

南京移动家庭有线宽带使用小记

2009-12-03 by Jinyang | 1 Comment | Filed in 生活随笔

这几天把家里的宽带从电信我的e家换为了移动的移动之家 家庭宽带,像我这样价格敏感型用户,因为只是家里用用,所以想着移动毕竟也都是新铺的光纤线路,带宽质量上也应该差不到哪去。

这两天使用的感受看如果不是有什么特别对带宽高的要求,移动还是挺靠谱的,PPLIVE、QQLIVE看电视视频都不卡;下载一般也都在200K以上(基本等同电信的2MADSL,稳定性上有点差距)。
下面是在晚上9点多使用QQ邮箱速度测试的截图
 

南京移动宽带也是使用的标志的PPPOE拨号,所以路由上网也应该没问题的。

国内的企业总是这样,自己有优势的东西就是不降价,作为后来者时也知道拿出来一点点运营技巧来拉拢客户。总之就是“有竞争才有进步”,否则我这小市民只能一直用电信的移动业务+移动的宽带业务。

Tags:

Squid/3.0+Apace/1.3+mod_gzip/1.3.26.1a 测试

2009-11-18 by Jinyang | No Comments | Filed in 技术相关

Q项目从来不需要操心带宽的事情,加之此前尝试为Web容器增加cache module出现不太顺利而放弃,所以一直没有启用gzip压缩(

 

 

 

  FJapache/8.0 (Unix) ,对应Apache1.3)。但是看了车东老师的文章: mod_gzip:Apache的HTTP压缩优化(http://www.chedong.com/tech/compress.html) 说到:"HTTP压缩对于纯文本内容可压缩至原大小的40%一下,从而提供60%以上的数据传输节约",感觉还是很值得操作。毕竟使用YSlow得分太低也不光彩。(Grade:F; Overall performance score 31;

 

  Ruleset applied: Classic(V1)

 

  URL: http://qh.ct10000.com/index.html )

 从sourceforge直接下载很久已不更新的mod_gzip.so.gz http://sourceforge.net/projects/mod-gzip/files/ ,直接配置加载后竟然没报错 (非单纯的Apache,所以总担心在兼容性上不友好,以至于都不喜欢折腾它了 )。
有图有真相:
未启用gzip前:
启用gzip后: 

 按照上图计算: 5/18=0.277 ,足足节约了72%的网络传输。(或许因为代码写的不好,所以被压缩后效果更明显 )

在web的前端有使用Squid/3.0做缓存,较多的网友反馈Squid3之前的版本对gzip的支持需要做一些配置修改或不太友好,我实际使用中未进行额外针对性的测试(添加了vary后squid提示不推荐就删除了),次日发现压缩后的页面已被缓存。

Tags:

天下黄河贵德清 新物理高度

2009-11-08 by Jinyang | 1 Comment | Filed in 生活随笔

今天早上本来计划去加班把套餐展示+套餐比对+套餐预受理给搞定的,但是最近事情太多了,很繁琐,就想出去投个气,毕竟昨天加班+熬夜也算基本把框架基本定了,整个系统也算逐渐清晰可用了。

青海大的景点基本都去过了,近的也就塔尔寺和贵德,塔尔寺我也去过了,所以就只能选择贵德或再找其他的景点。先找了地图,看上去贵德里西宁挺近的,就直接和西宁打地界。

打车去西宁汽车东站的路上和师傅聊了下,说贵德离西宁300公里,开车2小时,贵德号称青海的小江南,有温泉,腿脚不灵活的去泡泡就会走路了,当然说是要泡1个月,回去再在床上保暖10多天,夏天的水滚烫,过年了的时节最合适。贵德的气温比西宁高一些,要比西宁少穿一件衣服。

车票24含保险(票面上直接包含的,非另售的),车次还不少(一小时一班)。只是车子在市区先走了半个多小时。出西宁走西塔高速(西宁-塔尔寺)就开始爬坡(这次出来没待相机,主要是相机包太大了,手机拍照好烂,哎。),

西宁拉鸡山,上图就是3800米的山口:
拉鸡山属日月山支脉,藏语称“贡毛拉”,意为嘎拉鸡(石鸡)栖息的地方。拉鸡山是贵德与湟中的界山,由西向东蜿蜒,最高峰海拔4524米。海拔3800余米的拉鸡山山口地理位置重要,宁果公路穿越而过,山口南侧还有通往湟源的公路。      拉鸡山北坡险峻,山岩多有裸露,除夏季外,山坡常常白雪覆盖。南坡平缓,宜牧草生长。这里的红山嘴草场是尕让乡夏季牧场,北从拉鸡山口至分水岭,南至大滩村,中心海拔3746米。      草场内坡地平缓,水源充沛,牧草生长良好。每当夏季来临,山坡上绿草如茵,繁花似锦,牛羊成群,牧歌声声,还有空阔的蓝天、悠悠的白云,是闹市人向往的佳境。  

过了拉鸡山口就开始全部是下坡了,连续40里下坡,严防制动失灵。

 

一路上没什么庄稼,当地局面主要靠放牧为生:
 

 车子一路下坡,摩擦很严重,下到半山就需要用水降温清洗
 
 

 

终于看到黄河啦!

进县城下车后,先在大街上走了走,找吃的打点下肚子,

 
看到电信营业厅,就顺便进去看了下,人还有几个,也干净简洁,挺好。

中午吃了当地的米饭,还是和西宁一样是煮烂了的米饭。倒是问了店家如何去黄河边,店家还是给很清楚的指点了下,说是不算远,我们就走下去了,
 

贵德号称是梨乡,我们过来的季节已经是冬天了(但是依然非常热,离太阳太近了),只能看到一些树上还挂剩下的果子,
 

中间有问了下路,就顺着上图一直走下去了,果然不一会就到了河边,
 

洗了个脸,剪了几块石头,因为听说最晚的班车是5点的,就充充回去了,

Tags:

网站对外统一URL链接、基于拼音缩写的快速功能定位跳转

2009-11-06 by Jinyang | 2 Comments | Filed in 技术相关

功能性的门户网站,难免有很多外部的网站做了到站内某些功能的链接,这些链接初期是有效的,但因为网站的改版升级,双方又不能及时有效的沟通变更难免会导致原来的一些链接变成空链, 如果网站本身能主动提供一个统一的对外url供外部系统调用(内部使用当然也是可以的),自然就可减少不必要的劳动。

我的规划如下;

 /go/*  的链接统一用叫urlRedirect的sevlet进行处理;

/go/命令/关键字
      其中命令规划: n:按名称 l:列表 q:基于拼音简写快速定位 c:按编码 s:搜索 

如: /go/l/all  即表示列表全部链接资源
     /go/n/OneHome 即表示按名称查询"OneHome"的链接

示例图1:
 

如果根据条件可以唯一匹配到URL则自动跳转至匹配到的URL,如匹配到多个或无有效的匹配数据则提示用户
示例图2:
 

在上述URL跳转的功能上,还可以做出基于拼音简写指令的快速跳转功能,
如用户输入jfgl后按回车即可自动跳转到相应页面,
示例图3:
 

上述功能也是一时兴起随手而开发的,基本也没花费太多的精力做规划,同事也有提出可以在此基础上再做个智能的指令输入提示,呵呵,不过估计这种命令行式的功能也只有少数人会用。倒是按拼音把所有功能都归类一下倒是能方便用户。

Tags:

第一次参与抽奖

2009-11-03 by Jinyang | 2 Comments | Filed in 生活随笔

第一参与抽奖,上午先进行了几次试验都比较顺利,担心电脑坏掉还特地备份了完整的数据和程序到U盘。局方市场部准备的很充分,拉了横幅,并张贴了2张宣传画,因为是电视电话会议室,最后还特地支起了一个投影。

 

Tags:

Squid+Apache+Tomcat 缓存 负载 双机

2009-10-31 by Jinyang | No Comments | Filed in 技术相关

10-1前夕因为系统重新部署(原因见上上篇)导致整个假期过的都比较郁闷,每天睡前都要看下系统是否正常,早上也是早早起来先看看服务down了没,还临时搞了个监控页面(不太容易识别异常所以就没做短信报警),出去玩也隔一会手机查看下。因为是生产系统,问题不太容易定位,每次兴奋的改了配置或程序总以为可以了,第二天却又出现系统慢的无法访问的故障。

稳定可以说一个系统最重要最基本的要求了,有基础才有可能做出优秀的应用功能,否则一切都白扯。

参阅了N多资料,结合现有资源(2台Web)做了简单的改进,一个月的观察下来总得比较满意,起码是再没有出现过慢的无法访问的现在。

当前的逻辑结构如下:

1. 域名->公网IP->私网IP

2.Squid 监听 私网IP:80

3.Apache 监听 127.0.0.1:80

4.Apache 使用JK2 集群2个tomcat

之所以配置了squid和apache都监听80端口 是因为如果真实web服务不使用80端口 就会自动被加上端口

 

Tags:

南京电信宽带推送广告代码

2009-10-17 by Jinyang | 1 Comment | Filed in 站长视点

南京电信这几天几乎天天推送广告,手法简单粗暴,不知道效果如何,我是要换移动宽带了。

页面源代码:

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <title>无标题文档</title>
  <style type="text/css">
  <!–
  td {
  font-family: Verdana, "宋体";
  font-size: 11px;
  line-height: 180%;
  color: #333333;
  }
  a {
  color: #333333;
  text-decoration: none;
  }
  –>
  </style>
  </head>
   
  <body style="margin:0;padding:0; height:100%" scroll=no>
  <!–用户原访问地址–>
  <iframe id="content" name="content" src="http://hsining.com/info/?GBxMB0GS87=sb8Zn5i4mr" marginwidth="0" marginheight="0" frameborder="0" width="100%" height="100%" >
  </iframe>
  <!–自动适应高度脚本 解决IE7不能适应问题–>
  <script language="javascript">
  function autoheight(sid) {
  var gid=document.getElementById(sid);
  gid.height=document.documentElement.offsetHeight-5;
  }
  window.setInterval("autoheight(\"content\")",100);
  </script>
  <!–插入广告脚本–>
  <script src="js/up.js" language="JavaScript"></script>
  </body>
  </html>

 

JS代码:

 window.onload = getMsg;    window.onresize = resizeDiv;    window.onerror = function(){}    //提示使用    var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,i = 0;    function getMsg()    {      try{        divTop = parseInt(document.getElementById("jiezp").style.top,10)        divLeft = parseInt(document.getElementById("jiezp").style.left,10)        divHeight = parseInt(document.getElementById("jiezp").offsetHeight,10)        divWidth = parseInt(document.getElementById("jiezp").offsetWidth,10)        docWidth = document.body.clientWidth;        docHeight = document.body.clientHeight;        document.getElementById("jiezp").style.top = parseInt(document.body.scrollTop,10) + docHeight + 10;//  divHeight        document.getElementById("jiezp").style.left = parseInt(document.body.scrollLeft,10) + docWidth - divWidth        document.getElementById("jiezp").style.visibility="visible"        objTimer = window.setInterval("moveDiv()",10)      }      catch(e){}    }    function resizeDiv()    {      i+=1          if(i>10000) closeDiv()    //客户想不用自动消失由用户来自己关闭所以屏蔽这句      try{        divHeight = parseInt(document.getElementById("jiezp").offsetHeight,10)        divWidth = parseInt(document.getElementById("jiezp").offsetWidth,10)        docWidth = document.body.clientWidth;        docHeight = document.body.clientHeight;        document.getElementById("jiezp").style.top = docHeight - divHeight + parseInt(document.body.scrollTop,10)        document.getElementById("jiezp").style.left = docWidth - divWidth + parseInt(document.body.scrollLeft,10)      }      catch(e){}    }    function moveDiv()    {      try      {        if(parseInt(document.getElementById("jiezp").style.top,10) <= (docHeight - divHeight + parseInt(document.body.scrollTop,10)))        {          window.clearInterval(objTimer)          objTimer = window.setInterval("resizeDiv()",1)        }        divTop = parseInt(document.getElementById("jiezp").style.top,10)        document.getElementById("jiezp").style.top = divTop - 3      }      catch(e){}    }    function closeDiv()    {      document.getElementById('jiezp').style.visibility='hidden';      if(objTimer) window.clearInterval(objTimer)    }  document.writeln("<DIV id=jiezp style=\"Z-INDEX:3; LEFT: 0px; VISIBILITY: hidden; WIDTH: 352px; POSITION: absolute; TOP: 0px; HEIGHT: 250px\">");document.writeln("<table width=\"352\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" style=\"border-width:1px; border-style:solid; border-color:#cccccc\">");document.writeln("<tr>");document.writeln("<td width=\"342\" align=\"right\"><img src=\"images\/close.jpg\" width=\"43\" height=\"15\" border=\"0\" onClick=closeDiv() style=\"cursor:pointer\"><\/td>");document.writeln("<\/tr>");document.writeln("<tr>");document.writeln("<td align=\"center\">");document.writeln("<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td align=\"center\"><a href=\"http:\/\/enjoy.js.vnet.cn\/china60\/\" width=\"344\" height=\"251\" border=\"0\" target=\"_blank\"><img src=\"http:\/\/www1.js.vnet.cn\/push\/0909\/60y\/images\/60.jpg\" width=\"344\" height=\"251\" border=\"0\" ></a><\/td><\/tr><\/table>");document.writeln("<\/td><\/tr><\/table>");document.writeln("<\/DIV>");

 

Tags:

某防篡改软件简单分析

2009-09-23 by Jinyang | 1 Comment | Filed in 技术相关

昨天某产品众多、公司名称包含了国内某著名大学做前缀的公司要在我负责的项目系统上做网页防篡改的测试,据说现场人员要求直接在生产环境部署,所幸被要求先在测试环境上做测试再决定,我想我对该公司产品的反感或许起于其直接生产环境做测试的要求。

因为我们没有人员在现场,在询问了我们的web目录后,部署等事宜都是该贵公司自己实施的,后来要求我加个过滤器,还问我过滤器懂吧,我问是在web容器层的还是更前端层次的,答曰就是要修改应用代码来实现。很配合的帮他们把2个class文件集成到项目中,我和他们说部署好了,然后就听见电话那端有人说没问题了 -_-  -_- ,我郁闷了,部署好==没问题 ?

昨天下午由于很多事情也没看具体的机制,因为也没有得到什么文档,不知道人家具体的实现机制。后来听说可以实现即使使用root帐户登陆也能保障文件不被篡改,下班的路上和同事讨论了这个,同事认为如果不修改系统的内核、不使用外置硬件装置,就不能说能做到root都无法修改。我也认为root帐户如果都丢了,人家就算不破坏你啥文件,只需要把内核的文件破坏了或者关机啥的一样能造成不良影响。再说如果能实现让root还有做不到的事情,那明显和root用户设计的初衷为超级帐户而不吻合(我瞎想的 基于我对linux的很初级的认识)。

查看了下系统的进程、端口以及文件内容,总结如下:

 

   1. 禁止root用户修改删除文件机制的实现为使用 chattr +i 更改文件的权限实现 

    2. 防篡改及发布的同步机制主要依赖rsync实现
    3. 进程守护(猜测作用为守护定时调度程序,定时调度程序依据配置时间间隔调用rsync同步命令进而实现内容发布更新或保护更改)可能(仅为我个人猜测)使用了网上有公开的实现代码 (网址:http://bbs.chinaunix.net/viewthread.php?tid=845560 

联系了下进程守护的作者聊了下,人家也很是气愤,同时又感叹程序员辛苦的写代码,但是没有市场资源,有市场资源的家伙拿着开源的代码,甚至连了简单的封装都不做,也不做任何的改进,不管人间代码发布使用的著作权协议,就去投标拿钱。

世道啊!

 

  

Tags:

返回顶部