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脚本如下:

#!/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
"

inotifywait -mrq --format '%f' -e modify,delete,create,move ${WEB_DIR} | while read file
do
    PURGE_URL=`echo "http://dvs.china.com/$file"`
    for i in $IPLIST;do
        /home/tools/squidclient -p 80 -h $i -m purge "$PURGE_URL"
    done
    curl -s -d "username=test&password=123456&type=1&url=$PURGE_URL" http://pushwt.dnion.com/cdnUrlPush.do
done