inotify+purge_cache

24 Aug 2010 Posted in  linux

linux内核从2.6.13开始,加入了inotify特性。对目录、文件的各种修改,都会发出inotify信号。包括
IN_ACCESS
IN_MODIFY
IN_ATTRIB
IN_CLOSE_WRITE
IN_CLOSE_NOWRITE
IN_OPEN
IN_MOVED_FROM
IN_MOVED_TO
IN_CREATE
IN_DELETE
IN_DELETE_SELF
IN_MOVE_SELF
IN_UNMOUNT
IN_CLOSE
IN_MOVE
目前最常见的inotify应用,就是和rsync配合进行实时同步。
而对web发布路径进行inotify监听的话,可以实时PURGE掉前端cache,保证网民访问的实效性。内容更新周期不固定的一些网站,大可以设定长一些的expires(也不要太长,不然浏览器端本身的缓存影响比较大),然后通过inotify监听来强制控制缓存时间,应该是比较有效果的。
最早的思路,先用perl的Linux::Inotify模块watch目录,read出每次event的name;再用IO::Socket模块向squid发送”PURGE $url HTTP/1.0\n\n”请求,最后用WWW::Curl::Form模块POST数据到CDN的刷新接口。洋洋洒洒好几十行后,发现利用inotify-tools、curl、squidclient等现成的工具,写成的shell脚本更加简单而且方便。
先修改squid.conf,添加web服务器ip的purge权限,重读配置;
在web服务器上,从sourceforge下载inotify-tools源码编译:wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz && tar zxf inotify-tools-3.14.tar.gz && cd inotify-tools-3.14 && ./configure –prefix=/usr && make && make install
从squid上scp /usr/local/squid/bin/squidclient 到web服务器上;
要是没有curl的话,yum install一个。
最后创建inotify-purge.sh脚本如下:
```bash
#!/bin/bash
WEB_DIR=/path/to/example
IPLIST=”1.2.3.4
1.2.3.5
1.2.3.6
1.2.3.7
1.2.3.8
继续阅读……


nagios绘图

13 Aug 2010 Posted in  monitor

nagios默认command中,有个未开启的process_performance_data。可以开启它来保存数据,然后提供给rrdtools绘图。 继续阅读……


gnuplot画图

13 Aug 2010 Posted in  monitor

之前提高日志流量统计的问题。并给出了分时流量的计算方法。当是想的是用perl调用rrd或者gd画图,甚至有把日志统计也写成perl的打算。
不过今天发现了一个小工具gnuplot,画图功能相当强大(在找资料的时候看到台湾有人用这个画台湾的三维地形图!),上手相当简单,尤其适合日志统计分析,相比来说,rrd还是比较适合实时监控画图的情况。
比如当初的脚本输出如下:
[root@Zabbix cache]# tail test.log
23:14 506.877
23:19 501.068
23:24 493.254
23:29 469.184
23:34 460.161
23:39 426.065
23:44 429.734
23:49 409.255
23:54 423.512
23:59 390.676
然后编写gnuplot的配置文件如下:
bash [root@Zabbix cache]# cat log.conf set terminal png truecolor size 550,250    #指定输出成png图片,且图片大小为550×250,需要ligpng支持,采用默认颜色设定 set output "log.png"    #指定输出png图片的文件名 set autoscale    #轴向标记自动控制 set xdata time    #X轴数据格式为时间 set timefmt "%H:%M"    #时间输入格式为"小时:分钟" set style data lines    #数据显示方式为连线 set xlabel "time per day"    #X轴标题 set ylabel "Mbps"    #Y轴标题 set title "image.tuku.china.com flow"    #图片标题 set grid    #显示网格 plot "test.log" using 1:2 title "access_flow"    #从test.log文件中读取第一列和第二列作为X轴和Y轴数据,示例名"log_flow"
最后运行cat log.conf | gnuplot命令,就生成了log.png文件,如下:

就是不知道X轴上这个01/01怎么消除掉……
对比帝联提供的flash图片如下:

可以看出基本是一致的。 继续阅读……


bc命令及其他

13 Aug 2010 Posted in  bash

在写check_if_flow.sh的时候,因为要比较的值太多,几个网卡,每个都分进出、然后分w和c。如果直接if判断大小,会写的无比庞大……于是想到根据比较结果先输出一个变量,大就是1,小就是0,类似这种。 继续阅读……


流量监控

05 Aug 2010 Posted in  monitor

流量监控,一般看cacti上的绘图。近日打算设置报警,懒得给cacti加模块,自己写个脚本吧,于是开始研究这个流量监控的方式。
先是在网上看到一个nagios的check_traffic.sh脚本,核心就是用snmpwalk取网卡总流量,写在/tmp/某个文件下,下次nrpe启动check时,再去新的总流量,减去文件中读取出来的值,除以启动间隔时间,就是平均流量值。
用snmpwalk -v 2c -c public localhost IF-MIB::ifInOctets取出值来一看,发现和ifconifg出来的RX数值是一样的!
然后有张宴的net.sh脚本,从/proc/net/dev中取值,然后存进变量后,sleep一定时间,再取一次,同样相减再做除法,得出平均流量值。
再cat /proc/net/dev和ifconfig的一比较,数值也是一样的,把两个脚本设定相同间隔,同时运行,显示的结果都是一样的!
那从本机监控的角度来说,那当然是从proc中取值计算容易了。毕竟给一大把机器装snmpwalk很费的……
(因为近期cacti上的图时不时有某些机器突发满载流量尖峰,持续时间又很短,所以靠cacti或者nagios本身这种间隔性轮询扫描很可能就错过去了)
最终想法是,在机器上后台长期运行监控脚本,碰到流量突发,发送到监控服务器,监控服务器上开启sniffer或者wireshark抓包,同时发邮件报警。
目前初步完成监控客户端脚本如下: 继续阅读……


concat

04 Aug 2010 Posted in  CDN

今天逛到淘宝核心系统组的公开博客,然后知道了淘宝开源平台http://code.taobao.org/,刚出来的东东,上面开源了淘宝目前正在使用的key-value分布式存储tair和nginx的concet模块、Cookie模块,以及这个平台本身的代码……在回复中,淘宝的人说有关tair的update都会同步在这个平台上进行,而不是另起一个闭源分支,或者想新浪的sina-sdd那样放弃。据说九月份,淘宝还会放出它的分布式文件系统TFS来,毕竟时间不长,会不会“人亡政息”,有待考验…… 继续阅读……


squid2.6的bug(if-none-match)

03 Aug 2010 Posted in  CDN

话接上篇。
在发现经过squid的刷新请求头不带If-None-Match后,向squid-user发邮件询问。Amos回复如下: 继续阅读……


郁闷的last-modified和etag试验

01 Aug 2010 Posted in  CDN

手上有一个伪静态的论坛bbs.example.com,每当有用户回复帖子的时候,提交到r.bbs.example.com,然后由r.bbs.example.com的提示页面replyautojump.jsp延迟3000后调用window.location.href函数返回原来的帖子——期间即完成对该帖的静态化。 继续阅读……


网络监控与/proc/net/tcp文件

28 Jul 2010 Posted in  monitor

nagios自带的check_antp太过简约,除了状态统计输出外,什么参数都不提供。在面对不同应用服务器时,报警就成了很大问题。于是决定自己写一个check脚本。作脚本运行,与命令操作时一个不同,就是要考虑一下效率问题。在高并发的机器上定期运行netstat -ant命令去统计,显然不太合适,可以直接从proc系统中取数据,这就快多了。 继续阅读……


日志流量计算

28 Jul 2010 Posted in  bash

一般来说流量带宽是通过snmp协议取网卡流量画图。不过有的时候,为了优化分析或者排错,也会直接去计算服务的访问流量。方法很简单,根据日志中记录的请求时间(squid记录的是请求响应完成时间,如果要精确,可以再减去响应时间,不过一般squid的文件不至于5分钟内还传不完的……),按每5分钟一汇总其字节数,然后均摊到300秒上。 继续阅读……


域名切换导致的 SEO 问题

17 Jul 2010 Posted in  web

网站某频道准备启用新域名,切换过程中,为了保证网民访问效果,对老域名下的所有请求设置了重定向到新域名下相同url。测试访问正常后上线使用。 继续阅读……


初识NetApp存储

17 Jul 2010 Posted in  linux

对专门的存储设备实在所知甚少,今天有时间找了找netapp的资料看看,有点基本了解。资料见豆丁:http://www.docin.com/p-56454923.html 继续阅读……


login-shell的更改

06 Jul 2010 Posted in  linux

之前用ports把BSD系统的login-shell改成bash后,今天又打算改回csh去。不料重新chsh -s /bin/csh后,却弹出如下错误提示: 继续阅读……


Java报错一例

03 Jul 2010 Posted in  java

新迁移一例apache+resin系统,运行不久后时不时就出现500错误。从日志中看到如下报错: 继续阅读……


动态页面正文部分中文乱码排障一例

26 Jun 2010 Posted in  web

公司网站一部分动态页面,早先使用apache+resin的架构运行,考虑到高并发访问下的响应性能问题,在前不久逐步开始用nginx替换掉了apache。
不过随后发现了一个问题,随意进入某一有分页的网页,第一页是正常的(因为静态化过了);点“下一页”,出来的页面两边正常,中间部分的标题、关键字等也正常,唯独每个标题下的正文无法正常显示。
因为有做过系统调整,所以第一反应就是新上的nginx配置有问题。按照经验,可能是nginx.conf中指定的chaset与borwser不一致?但选定utf8后现象依旧,何苦同一页面内的其他字符又是正确显示的~~~
然后通过内网IP+端口的方式,直接向resin请求抓取到的乱码页面url。结果,nginx+resin的机器显示乱码,apache+resin的机器显示中文——由此确认问题不是nginx,而是resin的!
diff两台机器的resin.conf,除了开启的端口外,没有任何不同的地方。
检查两台机器的环境变量,发现nginx这台的LANG是zh_CDN:gbk(静态化程序有需求),而apache这台是utf8。试着也修改成utf8然后重启resin,访问结果依然不对。
这下基本没招了……完全一样的环境和配置,取的同一台nfs的数据,为啥就能显示不同呢?难道是编译参数的问题?
去sharepoint上下载公司文档,查看原先的resin都使用了那些configure选项。结果发现为了配合apache,使用了–with-apache等。莫非就是因为这个原因导致resin脱离apache运行出现问题了?
下载和现行resin版本一致的源码报,不再with-apache编译完成,cp一份conf过来,改用另一个端口启动,然后通过这个端口访问那个url,结果显示正常了!
替换下原先的resin,把nginx的upstream指向新resin,故障解决。
看来以后再替换apache+resin成nginx+resin的时候,resin也要重新编译一个了…… 继续阅读……


$RANDOM变量妙用

23 Jun 2010 Posted in  bash

$RANDOM是linux自带的一个随机数变量,其随机范围从0-32767(man bash说的)。每次unset再恢复后,$RANDOM都会变化。 继续阅读……


折腾 awk 内调用 shell 变量

07 Jun 2010 Posted in  bash

在对squid进行目录刷新的时候,一般使用的脚本都是采用for i in squidclient mgr:objects|grep $1|awk '{print $2}';do squidclient -m purge “$i”;done的方式。 继续阅读……


文件锁和 CPU 绑定

30 May 2010 Posted in  linux

从网上看到的两个锁定,都是util-linux包里的。 继续阅读……


xen安装PV

28 May 2010 Posted in  cloud

闲来无事,打算自己安装一个xen虚拟机,看了看文档,知道必须采用网络安装方式(NFS/FTP/HTTP),于是随手去搜狐镜像站下了一个iso下来挂载用。
不过virt-install一直报错。
首先是:
mount.nfs: Input/output error
umount: /var/lib/xen/xennfs.jfkgaj: not mounted
ERROR:  Unable to mount NFS location!
诡异了,我手动都能mount上远端的nfs了~~百度没结果,谷大婶出动,原来这边也要启动portmap才行。
下一步,继续出错:
ERROR:  Invalid NFS location given: [Errno 2] No such file or directory: ‘/var/lib/xen/xennfs.JjVbzO/images/xen/vmlinuz’
没有文件?返回nfs上去看,嗯,目录下只有一个LiveCD,一个isolinux。咋回事呢?
又返回搜狐去翻目录,在os/下看到了images/xen/vmlinuz,难道要把整个os/目录下载了?可我记得这个目录就应该是iso挂载后的东西呀~
返回isos/去看,终于发现一个极弱智的问题:目录下有LiveCD和bin-DVD两个镜像,我直接点了最顶上的一个,也就是LiveCD那个……
赶紧重新下载……
之后一路顺利。
A机(10.10.10.10)上:
bash wget http://mirrors.sohu.com/centos/5.4/isos/x86_64/CentOS-5.4-x86_64-bin-DVD.iso -c mount -o loop -t iso9660 /cache/CentOS-5.4-x86_64-bin-DVD.iso /mnt echo '/mnt 10.10.10.0/24(ro,async)'>>/etc/exports /etc/init.d/portmap start /etc/init.d/nfs start
B机(10.10.10.11)上:
bash mkdir /img dd if=/dev/zero of=/img/test.img bs=1024k count=8k virt-install --paravirt --file=/img/test.img --name=test --ram=1024 --vcpus=1 --bridge=xenbr0 --bridge=xenbr1 --nographics --location=nfs:10.10.10.10:/mnt
(半虚拟化、虚拟机安装位置、虚拟机名、内存、CPU、桥接网卡*2、文本模式、安装源)
然后就是很普通的linux安装过程了,填ip,分区云云……选择最小化安装,reboot。
又见报错:
Restarting system.
libvir: Xen Daemon error : GET operation failed:
Guest installation complete… restarting guest.
libvir: Xen Daemon error : GET operation failed:
libvir: Xen Daemon error : internal error domain information incomplete, missing kernel
Entity: line 30: parser error : Opening and ending tag mismatch: os line 5 and domain
</domain>
         ^
Entity: line 31: parser error : Premature end of data in tag domain line 1
哪里有问题呢?
随手xm list,发现居然有一个名叫test的的guestOS,赶紧console一看,完全能用!!
不太相信的关机,重新create了一次,还是没问题!
把在/etc/xen下自动生成的test文件mv进/etc/xen/auto下,再把整个宿主机一重启,几分钟后重登陆一看,testOS也已经启动起来能用了。完成!
 
继续阅读……


perl的POD权限问题

27 May 2010 Posted in  perl

今天继续查找mod_perl对req_header的处理。 继续阅读……


apache防盗链(mod_perl试用三)

27 May 2010 Posted in  web

客户的要求,还剩下最后一步,就是referer限定。对于apache,有Mod_rewrite现成的可用:
apache RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://(www.)?test.com/.*$ [NC] RewriteRule .mp3$ http://www.test.com/ [R=301,L]
不过既然之前已经用了perl,这里就一口气把perl写完吧:
perl sub handler {     my $r = shift;     my $s = Apache2::ServerUtil->server;     my $secret = $r->dir_config('Secret') || '';#这里可以写成$r->dir_config->{Secret}     my $uri = $r->uri() || '';     my $expire = 2 * 3600; +    my $referer = $r->headers_in->{Referer} || '';#这里却不可以写成$r->headers_in(Referer),会报错“argument is not a blessed reference (expecting an APR::Table derived object),不知道为什么? +    if ($referer =~ m#^http://music.test.com#oi){     if ($uri =~ m#^/(d{4})(d{2})(d{2})(d{2})(d{2})/(w{32})(/S+.mp3)$#oi){         my ($year, $mon, $mday, $hour, $min, $md5, $path) = ($1, $2, $3, $4, $5, $6, $7);         my $str = md5_hex($secret . $year . $mon . $mday . $hour . $min . $path);         my $reqtime = mktime(00, $min, $hour, $mday, $mon - 1, $year - 1900);         my $now = time;         if ( $now - $reqtime < $expire){                 if ($str eq $md5) {                     $r->uri("$path");                     return Apache2::Const::DECLINED;                 }         }    } +} }
简单两句话,就ok了。测试如下:
[27/May/2010:22:45:00 +0800] "GET /201005272218/ceaf967f6bcf9a185a3287b2e3ff5a02/smg/123.mp3 HTTP/1.0" 200 - http://music.test.com "Wget/1.10.2 (Red Hat modified)"
[27/May/2010:22:45:05 +0800] "GET /201005272218/ceaf967f6bcf9a185a3287b2e3ff5a02/smg/123.mp3 HTTP/1.0" 404 - http://www.baidu.com "Wget/1.10.2 (Red Hat modified)"
[27/May/2010:22:45:17 +0800] "GET /201005272218/ceaf967f6bcf9a185a3287b2e3ff5a03/smg/123.mp3 HTTP/1.0" 404 - http://music.test.com "Wget/1.10.2 (Red Hat modified)"
对于各种非正常的访问,都返回404 NOT FOUND。
如果想要返回403 ACCESS DENIED的话,经测试,在前面这些handler是没法做到的,必须在perlaccesshandler里才能return FORBIDDEN。那只能在之前的transhandler里统一改写uri成一个约定字符串,然后在access中再匹配拒绝。很麻烦。。。 继续阅读……


一个少见的squid报错

27 May 2010 Posted in  squid

今天有客户传过来一张报障截图,乍一看很正常的拒绝访问而已。可仔细一看,吓,地址栏里的url和errorpage返回的%U居然不一样!!

浏览器中写的是域名,squid却按配置拒绝的是对服务器ip发起的直接请求。
赶紧去日志服务器上汇总deny信息,终于找到了相关日志。都是一个ip发过来的,大概如下:
2010-05-25-14:04:13 0 60.209.232.219 TCP_MEM_HIT/200 15555 GET http://jobseeker.zhaopin.com/zhaopin/aboutus/law.html - NONE/- text/html “-“ “-“
2010-05-25-14:05:19 2 60.209.232.219 TCP_DENIED/403 1464 GET http://113.6.255.97/zhaopin/aboutus/law.html - NONE/- text/html “-“ “-“
2010-05-25-14:06:01 1 60.209.232.219 TCP_DENIED/403 1464 GET http://113.6.255.97/zhaopin/aboutus/law.html - NONE/- text/html “-“ “-“
2010-05-25-14:10:00 1 60.209.232.219 TCP_DENIED/403 1464 GET http://113.6.255.97/zhaopin/aboutus/law.html - NONE/- text/html “-“ “-“
2010-05-25-14:10:00 0 60.209.232.219 TCP_MEM_HIT/200 679 GET http://jobseeker.zhaopin.com/favicon.ico - NONE/- application/octet-stream “-“ “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)”
2010-05-25-14:12:39 2 60.209.232.219 TCP_DENIED/403 1464 GET http://113.6.255.97/zhaopin/aboutus/law.html - NONE/- text/html “-“ “-“
2010-05-25-14:12:41 1 60.209.232.219 TCP_DENIED/403 1464 GET http://113.6.255.97/zhaopin/aboutus/law.html - NONE/- text/html “http://jobseeker.zhaopin.com/zhaopin/aboutus/law.html” “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)”
截图的那个时间点,日志中的user-agent居然是空!而且就在短短的一分钟前后,就连续出现正确和错误的反复访问。。。。。。在同事的提醒下,试着扫描了一下这个clientip,发现它还开着80端口:
bash Starting Nmap 4.11 ( <a href="http://www.insecure.org/nmap/"><u><font color="#0000ff">http://www.insecure.org/nmap/</font></u></a> ) at 2010-05-25 17:22 CST Interesting ports on 60.209.232.219: Not shown: 1679 filtered ports PORT STATE SERVICE 80/tcp open http Nmap finished: 1 IP address (1 host up) scanned in 37.623 seconds
目前只能猜测这个ip应该是一个代理网关服务器,在转发访问请求的时候,把header中的Host信息给弄没了~~ 继续阅读……


apache防盗链(modperl试用二)

26 May 2010 Posted in  web

上回提到的防盗链方式是在strings上加上key和time,uri本身是不变的,这种方式其实现在不是很主流,主流的方式是将计算得出的加密串直接改在uri的路径里。比如下面将要提到的例子。要求其实和早先那个squid防盗链的一模一样,就是改成用apache来跑。 继续阅读……


(读书笔记)网卡调优MTU

23 May 2010 Posted in  linux

还是那本《linux操作系统之奥秘》,系统管理性能调校章节。7.1.3 Jumbo Frame: 继续阅读……


bash使用技巧

23 May 2010 Posted in  bash

几个跟ctrl有关的操作,很有爱,贴一下: 继续阅读……