网站进行内容更新是常有的事情,当被缓存的资源更新时,前端Squid 缓存服务器内容也必须要相应的更新,否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作,在服务器数量小的的时候这种方式还可行,如果服务器数量上了一定的规模,这就是一种非常笨重的处理方式,以下分别介绍通过编程方式实现刷新 Squid 的三种方法:

1.  refresh_pattern 用于配置Squid 的刷新策略,当 Squid 没有配置 ignonre-reload 来忽略客户端no-cache 和 reload 头的时候。

ignore-reload - ignores a client no-cache or reload header. Doing this VIOLATES the HTTP standard. Enabling this feature could make you liable for problems which it causes. (ignore-reload, 忽略客户端 no-cache 或 reload 头,这是违反 HTTP 标准的做法,允许此特性可能导致相关问题 . )

在这种情况下可以通过模拟客户端向服务器发送no-cache 头( ctrl + f5 就完成此功能)来实现刷新操作。发送的请求头如下:

<?php /** * 刷新Squid缓存 * */ interface Flush_Cache { /** * 执行刷新操作 * * @param void $url 待刷新的URL地址 */ public function flush($url); } /** * 通过发送HTTP Header头实现刷新功能 * */ class Flush_Cache_HTTP_Header_Impl implements Flush_Cache { /** * @see Flush_Cache::flush() * * @param void $url */ public function flush($url) { if(empty($url)) { return; } $url_component = parse_url($url); global $g_squid_servers; foreach ($g_squid_servers as $server) { $squid_params = split(':' , $server); $fsocket = fsockopen($squid_params[0], intval($squid_params[1]), $errono, $errstr, 3); if(FALSE != $fsocket) { $head = "HEAD {$url_component['path']} HTTP/1.1/r/n"; $head .= "Accept: */*/r/n"; $head .= "Host: {$url_component['host']}/r/n"; $head .= "Cache-Control: no-cache/r/n"; $head .= "/r/n"; echo $head; fwrite($fsocket , $head); while (!feof($fsocket)) { $line = fread($fsocket , 4096); echo $line; } fclose($fsocket); } } } } $g_squid_servers = array('192.168.2.88:80'); $flush_cache = new Flush_Cache_HTTP_Header_Impl(); $flush_cache->flush('http://www.squid.com/'); ?>

2.  通过PURGE 头刷新缓存,这需要 Suqid 配置 ACL 以允许 PURGE 请求头,实例如下:

acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1

acl Purge method PURGE

http_access allow AdminBoxes Purge

http_access deny Purge

打开配置之后可以使用如下的请求头来完成删除操作

PURGE http://www.squid.org/junk HTTP/1.0
Accept: */*

上个例子代码中,把HEAD 修改为 PURGE 即可,如下:

view plaincopy to clipboardprint?
01.$head = "PURGE {$url_component['path']} HTTP/1.1/r/n";  
02.$head .= "Accept: */*/r/n";  
03.$head .= "Host: {$url_component['host']}/r/n";  
04.$head .= "Cache-Control: no-cache/r/n";  
05.$head .= "/r/n"; 
$head = "PURGE {$url_component['path']} HTTP/1.1/r/n";
$head .= "Accept: */*/r/n";
$head .= "Host: {$url_component['host']}/r/n";
$head .= "Cache-Control: no-cache/r/n";
$head .= "/r/n";

3.  通过使用多播HTCP 包来完成 Squid 清理,这是 MediaWiki 目前正在使用的方法,当wiki 更新时用于更新全球的 Squid 缓存服务器,实现原理为:发送 PURGE 请求到特定的多播组,所有 Squid 服务器通过订阅该多播组信息完成删除操作,这种实现方式非常高效,避免了 Squid 服务器处理响应和建立 TCP 连接的开销。参考资料: Multicast HTCP purging

发送no-cache 头的方式在很多情况下不适用,因为大多数站长都会配置 ignore-reload 来阻止 no-cache 和 reload 头以提高 Squid 的命中率;通过适当的权限控制 PURGE 清理将是一种非常简单可行的方式,考虑到安全问题我们可以仅允许特定的主机进行 PURGE 清理操作,对第 1 , 2 种方式 进行简单的变通就可以用于管理较大规模数量的前端缓存服务器 - 我们可以在被允许的主机上提供一个专门的后台刷新队列,这个刷新队列在接收到刷新操作时就多线程的向前端服务器发送删除指令,这样就达到了同步刷新的效果。第3种方式没有进行过尝试,因为需要安装相应的补丁,并进行配置,操作成本相对较高,在服务器数量特别巨大的情况下这无疑是一种非常高效的实现方式。

4  批量清除Squid缓存的小工具
很实用的一个清除squid缓存的小工具:
http://www.wa.apana.org.au/~dean/squidpurge/

wget http://www.wa.apana.org.au/~dean/sources/purge-20040201-src.tar.gz
tar zxvf purge-20040201-src.tar.gz
cd purge
make
[root@cache purge]# ./purge -help
### Use at your own risk! No guarantees whatsoever. You were warned. ###

$Id: purge.cc,v 1.17 2000/09/21 10:59:53 cached Exp $
Usage: purge [-a] [-c cf] [-d l] [-(f|F) fn | -(e|E) re] [-p h[:p]]
[-P #] [-s] [-v] [-C dir [-H]] [-n]

-a display a little rotating thingy to indicate that I am alive (tty only).
-c c squid.conf location, default "/usr/local/squid/etc/squid.conf".
-C dir base directory for content extraction (copy-out mode).
-d l debug level, an or of different debug options.
-e re single regular expression per -e instance (use quotes!).
-E re single case sensitive regular expression like -e.
-f fn name of textfile containing one regular expression per line.
-F fn name of textfile like -f containing case sensitive REs.
-H prepend HTTP reply header to destination files in copy-out mode.
-n do not fork() when using more than one cache_dir.
-p h:p cache runs on host h and optional port p, default is localhost:3128.
-P # if 0, just print matches; otherwise or the following purge modes:
0x01 really send PURGE to the cache.
0x02 remove all caches files reported as 404 (not found).
0x04 remove all weird (inaccessible or too small) cache files.
0 and 1 are recommended - slow rebuild your cache with other modes.
-s show all options after option parsing, but before really starting.
-v show more information about the file, e.g. MD5, timestamps and flags.

1.清除URL中包含jackbillow.com的所有缓存
./purge -p 127.0.0.1:80 -P 1 -se 'jackbillow.com'

2.清除 URL 以“.mp3”结尾的缓存文件,例如:http://www.dzend.com/abc/test.mp3
./purge -p 127.0.0.1:80 -P 1 -se '/.mp3$'

5

批量删除squid缓存脚本

Squidweb缓存加速软件目前已经 是新浪、搜狐、网易等各大网站广泛应用。Squid会在设置的缓存目录下建立多个目录,每一个目录下又建立多个目录,然后才在最里层的目录中存放缓存文件(object)。squid会根据用户请求网页的URL进行哈希,生成缓存文件,存放在某一个目录中。squid启动之后,将在内存中建立一个哈希表,记录硬盘中缓存文件配置的情形。

对于类似http://you.video.sina.com.cn/index.html之类的网页,squid只会生成一个缓存文件。可以用squid附带的squidclient工具清除:

squidclient -m PURGE -p 80 http://you.video.sina.com.cn/index.html

注意:

Squid接受一种客户请求方式,用于删除cache对象。PURGE方式并非官方HTTP请求方式之一。它与DELETE不同,对后者, squid将其转发到原始服务器。PURGE请求要求squid删除在uri里提交的目标。squid返回200(OK)或404(Not Found)。

PURGE方式某种程度上有点危险,因为它删除了cache目标。除非你定义了相应的ACL,否则squid禁止PURGE方式。正常的,你仅仅允许来自本机和少数可信任主机的PURGE请求。配置看起来如下:

acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1

acl Purge method PURGE

http_access allow AdminBoxes Purge

http_access deny Purge

而对于带有参数的网页,例如新浪播客的Flash播放器http: //vhead.blog.sina.com.cn/player/outer_player.swf?auto=0&vid=4469852& uid=1278987704,因“?”后面的参数不同,导致URL也不同,squid会生成多个缓存文件,哈希分散存放在不同的目录。如果修改了这个 outer_player.swf文件,要更新squid缓存就要去清除不同目录下及内存中的很多个缓存文件,十分麻烦,于是我编写了一个Linux下的 shell脚本,去完成这件麻烦的事:

  脚本文件名:clear_squid_cache.sh

  #!/bin/sh

  squidcache_path="/data1/squid/var/cache"

  squidclient_path="/usr/local/squid/bin/squidclient"

  grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}' >cache_list.txt

  for url in `cat cache_list.txt`; do

  $squidclient_path -m PURGE -p 80 $url

  done

注意: 请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。

  设置:

  squidcache_path= 表示squid缓存目录的路径

  squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient

用法:

  1、清除所有Flash缓存(扩展名.swf):

  ./clear_squid_cache.sh swf

  2、清除URL中包含sina.com.cn的所有缓存:

  ./clear_squid_cache.sh sina.com.cn

  3、清除文件名为zhangyan.jpg的所有缓存:

  ./clear_squid_cache.sh zhangyan.jpg

效率:

经测试,在DELL 2950上清除26000个缓存文件用时2分钟左右。平均每秒可清除缓存文件177个。

编程方式刷新Squid缓存服务器的五种方法相关推荐

  1. squid缓存服务器

    squid缓存服务器 缓存概念 作为应用层的代理服务软件,squid主要提供缓存加速和应用层过滤控制功能 代理服务器 客户端向网站发送请求数据 (为了能承受更多的并发连接客户端访问先请求代理服务器听过 ...

  2. Squid缓存服务器和代理介绍

    squid的简单介绍 squid的概念 squid是一种用来缓存Internet数据的软件.接受来自人们需要下载的目标(object)的请求并适当的处理这些请求.也就是说,如果一个人想下载一web界面 ...

  3. Squid缓存服务器原理与实战演练

    Squid服务基础讲解 代理缓存机制: 代理的基本类型: 1. 传统代理:需要在客户端软件手动设置指定代理服务器 2. 透明代理:无需用户手动指定,通过路由.防火墙策略将访问重定向 Squid 反向代 ...

  4. 监测Squid日志的五种方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 原贴:h ...

  5. linux服务器清除cdn,Linux服务器中查找并删除大文件的五种方法,Linux系统清除文件内容的命令分享...

    很多时候,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用任何Linux命令行编辑器打开它.怎么能实现这一目标?在本文中,我们将借助一些有用的命令,通过几种不同的方式清空文件内容. ...

  6. 创建五星级评级的五种方法

    在喜欢和社交统计的世界中,评论是留下反馈的一种非常重要的方法.用户往往喜欢先了解他人的意见,然后再决定自己购买的物品,甚至是看电影看的文章,或者就餐的餐厅. 开发人员经常与审查作斗争--通常会看到难以 ...

  7. 小技巧:安装Linux的五种方法和心得(转)

    小技巧:安装Linux的五种方法和心得(转) 一.硬盘安装分两种情况: A. 是从Win系统上安装 B.是从别的Linux启动安装 这里介绍大多数人使用的Windows系统安装,第二种方法我还没有调过 ...

  8. JavaScript 实现网页截屏五种方法

    JavaScript 实现网页截屏五种方法 最近研究了下如何利用JavaScript实现网页截屏,包括在浏览器运行的JS,以及在后台运行的nodeJs的方法.主要看了以下几个: PhantomJS P ...

  9. Python实现将内容写入文件的五种方法总结

    本篇带你详细看一下python将内容写入文件的方法以及细节,主要包括write()方法.writelines() 方法.print() 函数.使用 csv 模块.使用 json 模块,需要的可以参考一 ...

最新文章

  1. java 常用正则表达式
  2. python logging模块使用
  3. 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - G.重复字符串
  4. 安装ORACLE RAC时,用到的一些小命令1.弹出CD,2:配置时间同步,3.查看磁盘信息UUID
  5. 2018-06-22 第四十七天 oracle
  6. PHP中的mb_convert_encoding与iconv函数介绍
  7. HTML+CSS+JS实现 ❤️翻页倒计时ui特效❤️
  8. java对比swith和if的不同,浅谈选择结构if语句和switch语句的区别
  9. pb中控件变颜色_基于GDI+技术开发工业仪表盘控件
  10. 【树莓派】简易LoRa网关搭建+服务器设置一条龙教程(the things network)
  11. zscore标准化步骤_几种常用数据标准化方法
  12. 计算机的存储容量1kb表示什么,存储容量1kb等于多少字节
  13. mysql 批量执行sql语句_MySQL中批量执行SQL语句
  14. 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 C:计算几何
  15. sql 计算法定假节假日解决方案一
  16. 机器人中的yaw/pitch/roll
  17. 如何使用(免费软件)Microsoft ICE轻松扫描大图片
  18. Web前端开发规范文档(更新于2013-01-13)
  19. 什么是B/S开发技术?
  20. docker替换阿里云镜像源

热门文章

  1. java的listroots_list(), listFiles(), listRoots() in Java
  2. 利用c语言检测气体浓度,一氧化碳气体检测仪的算法设计
  3. android手机内存这么大,专业解读:为什么安卓手机的内存越来越大?
  4. 3维线程格 gpu_图形处理单元(GPU)
  5. 自贡市职称计算机考试,四川省自贡市2012年职称计算机考试时间
  6. SpringBoot 【IDEA热部署+浏览器禁用缓存】迅速提升效率
  7. win10下Git和Tortoise安装并使用VS15保存到码云
  8. python基础知识整理 第一节:入门记录(包含代码与执行结果)
  9. remote: error: GH007: Your push would publish a private email address.
  10. php phpqueey内存泄露,phpQuery 占用内存过多的处理方法