设为首页 收藏本站
查看: 1294|回复: 0

[经验分享] Squid实践日志

[复制链接]

尚未签到

发表于 2015-11-19 12:51:07 | 显示全部楼层 |阅读模式
  一.基础篇
1.下载源代码并解压
cd /opt/software
wget -c http://www.squid-cache.org...
tar -zxvf squid-2.5.STABLE14.tar.gz
2.安装Squid Proxy Server
cd /opt/software/squid-2.5.STABLE14
./configure --prefix=/usr/local/squid
3. 设置squid.conf,内容如下
http_port 80
# squid 的端口
cache_dir aufs /usr/local/squid/var/cache 250 16 256
# 缓存目录:/cache 类型:ufs 大小:250mb 允许Squid在目录下建立一级(16)和二级目录(256)
cache_mem 64 MB
# cache内存大小:64mb
cache_store_log /var/log/squid/store.log
#Squid的日志1:在/var/log/squid下,注意此目录的权限
cache_access_log /var/log/squid/access.log
#Squid的日志2:在/var/log/squid下,注意此目录的权限
cache_log /var/log/squid/cache.log
#Squid的日志3:在/var/log/squid下,注意此目录的权限
### cache user
cache_effective_user nobody #缓存用户UID
cache_effective_group nobody #缓存用户组 GID
### cache admin
visible_hostname www.phpme.com
#发生错误时,生成提示所显示的缓存服务器
cache_mgr caminero.yang@gmail.com
#发生错误时,生成提示所显示的缓存服务器管理员名
acl badurls dstdomain popme.163.com
http_access deny badurls
#以上2句不允许使用该缓存服务器访问popme.163.com
acl badwords url_regex -i sex
http_access deny badwords
#以上2句不允许使用该缓存服务器访问URL正则表达式中含sex字样的URL
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#httpd 透明代理配置
acl all src 0.0.0.0/0.0.0.0
http_access allow all
4.启动squid
/usr/local/squid/sbin/squid -z  #初始化cache目录
/usr/local/squid/sbin/squid
以下信息可以参考判断问题
squid -k parse        #检查配置是否有错误,没有任何输出,证明配置基本是正确的!!!
squid -zX               #可以加一个X参数,看看初始化具体的项目.  
如果因为DNS无法启动squid,可以用下面的命令启动squid
squid –D
如果发现启动了一下,squid的进程又在进程列表中消失了。可以用下面的命令
squid -NCd2
5.设置hosts将需要cache的网址指向我们要指向的ip,再通过ie访问,就可以发现已经成功的配置squid了。
二.升级篇
1.限制可以cache的域名
修改squid.conf文件,最后一行修改为:http_access deny all
前面加上以下内容:
   acl allowurls dstdomain blog.cnfol.com
http_access allow allowurls
#以上2句只允许使用该缓存服务器访问blog.cnfol.com
原理说明:需要理解一下squid的读取配置的方式。Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。当定义了允许的规则,再定义一条deny的规则,则deny的规则不会生效。也就是说,在最后一条加上deny all可以保证只有在指定规则范围内才能使用。
2.限制cache的时间
   refresh_pattern ^http:  5  20%  50
#限制当网址是以http:开头的,那么在5分钟后,cache内的数据会被更新
说到这个问题,不得不说一下我在学习过程中发现的一个情况,FF中查看header几乎全部的请求都是miss,查看access.log发现状态是tcp_refresh_hit(关于状态说明此处不做详解),但是IE下吐出的头却是hit,状态时tcp_ims_hit。猜想可能是两个浏览器送出的头不同。对比两个头
FF:
IE:
3.限制可以cache的网址规则
设置带?号的网址不cache:在squid.conf中加入以下几行
   acl badwords urlpath_regex -i ?
http_access deny badwords
#以上2句不允许使用该缓存服务器访问URL正则表达式中含?字样的URL
注意:若发现未生效,请更换一下此语句的位置,当存在多个http_access的时候,位置不同也会造成问题,具体我们以后再研究。
设置特殊规则的网址不cache
   以博客为例,只想cache文章页(http://blog.cnfol.com/aa/1...,其他页面都不cache
   acl articleurl url_regex -i ^http://blog.cnfol.com/([0-9a-zA-Z_]+)/article/([0-9]+).html
http_access allow articleurl
acl badwords urlpath_regex -i .+
http_access deny badwords
#以上4句只允许使用该缓存服务器访问文章页
写了以上两个规则以后发现,当url不符合我们规则时时,访问结果都变成403了,这显然不是我们需要的结果,我们再看要如何修改
   Squid有一个no_cache的命令,可以指定规则不进行cache,如:
   acl articleurl url_regex -i ^http://blog.cnfol.com/shtml/([0-9]+).shtml
   no_cache deny articleurl
   #这样就不会cache我们指定的页面了。
接下来,我们试试看,如果我们希望只cache其中的某个规则的页面,而其他页面都不cache规则要如何来写
acl allowurl url_regex -i ^http://blog.cnfol.com/shtml/19.shtml
no_cache allow allowurl
acl denyurl urlpath_regex -i .+
no_cache deny denyurl
#以上四句的意思相信不用我再解释了吧
4.根据不同的规则设置不同的cache时间
refresh_pattern .shtml$  5  10%  5 ignore-reload
#限制当网址是以.shtml结尾的,那么在5分钟后,cache内的数据会被更新,但是我测试似乎结果并非如此
5.防盗链设置
acl picurl url_regex -i .bmp$ .png$ .jpg$ .gif$ .jpeg$
acl mystie1 referer_regex -i ^http://blog.cnfol.com
http_access deny !mystie1 picurl
#以上是防盗链设置,这里拒绝了不是从blog.cnfol.com过来的请求
#这句必须放在下面的语句之上,因为squid匹配条件的规则是按照自上而下的顺序,当匹配到允许或者拒绝的条件,就不会向下继续进行匹配,故限制条件应放在通配条件之上
acl articleurl url_regex -i ^http://blog.cnfol.com/shtml/([0-9]+).([a-zA-Z0-9]+)
http_access allow articleurl
上面的说明,可能有做过apache的rewrite的人会比较容易理解,我之前也被规则的顺  序困扰了很久,其实这个就是一个正常的程序员的思路,找到符合当前的规则就跳出,  否则继续向下。
6.根据头信息判断页面是否需要cache
上面已经说了我们可以通过refresh_partern来配置特定网址的过期时间。在Squid的手册上有这样一段话:refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。也就是说,我们可以通过服务器输出头信息来控制此cache的cache时间。如何控制呢?看下面的代码
$offset = 60;  
$ExpStr = "Expires: " .gmdate("D, d M Y H:i:s", time()+$offset) ." GMT";  
header($ExpStr);  
header("Last-Modified:". gmdate( 'D, d M Y H:i:s' ) . " GMT" );
#header("Cache-Control: max-age=".$offset);
#header("Cache-Control: public");
# Basic认证的网页若需要缓冲须用public的头
echo '

';
print_r(getallheaders());
?>
这段代码里面指定了页面的过期时间和最后修改时间。这样squid会按照这里指定的过期时间来控制cache的时间,而不会按照refresh_pattern的设置。
我在测试过程中,一开始只是使用了Expires,而没有使用Last-Modified,结果发现每次的结果都是tcp_miss,加了Cache-Control也没用,那么,我们要如何理解这几个参数(包括squid会返回的一个Date参数)与对squid的判断作用呢?
  Date:指squid从realserver中获得数据的时间
  Last-Modified:一般指页面生成的时间
  Expires:页面指定的过期时间
由于指定了过期时间,但未制定生成时间,我猜想squid会默认一个生成时间值,很可能是1970年1月1日,所以这个铁定是会被认为过期的,于是我们每次都会看到都miss了。而后来加了一个生成时间,判断无误。
说到这里,我想有必要再回过头去说要一下refresh_parttern这个配置。
  refresh_pattern语法如下:
refresh_pattern [-i] regexp min percent max [options]
#-i 是用来控制是否区分大小写的,min和max的单位是分钟,percent是百分比
对于一个cache是否过期,squid会这样计算,
If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的
else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的
else cache是过期的
有一点一定要记住::refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。所以,上面说的公式并不适用于有输出Expire和Last-Modified头的页面。
说到这里,我们再回过头来看FF和IE的问题,为什么IE可以hit而FF不行呢?
对比squid发给realserver的头,我们发现,ff请求的时候,squid请求(对realserver)头Cache-Control:max-age=0;而IE则是Cache-Control:max-age=960。
实际情况是这样,当第一次请求的时候,request中不会有max-age,而此时若squid中有所请求的资源未过期的拷贝,则squid会将拷贝返回给浏览器,这个是没问题的。问题出在,当第二次请求,本地的FF中已经包含了一个cache,此时FF会向squid发起请求要求验证本地cache是否有效,于是squid再次在服务器寻找cache,squid找到了一个貌似过期的资源,出现TCP_REFRESH_MISS状态。这样前台便出现miss的情况。但是,这样的情况为什么只出现在FF,而IE不会呢?我想是不是与响应头有关,在查看hit的时候返回的响应头
FF
IE
7.如何清除cache
有时候,我们可能想根据一定的规则清除cache住的一些资源,可以通过下面的方法实现:
1.squid –z重建cache区
2. squid清空缓存
# /usr/local/squid/sbin/squid -k shutdown 关闭squid
# echo "" > /usr/local/squid/var/cache/swap.state   写入一些垃圾数据到这个文件
# echo "" > /usr/local/squid/var/cache/swap.state   如果有多个....
#/usr/local/squid/sbin/squid –z
#/usr/local/squid/sbin/squid
如果你有多个cache目录,请为每个cache目录下的swap.state文件执行上门的命令
不能直接删除swap.state命令,或者是把这个文件清为0,需要写一些垃圾数据到这个文件中
3.还有一种比较夸张的方法,清除 URL 以“.mp3”结尾的缓存文件
#./purge -p localhost:80 -P 1 -se '.mp3$'(未验证)
三.高级篇
1. 什么是squid的命中率,如何分析squid当前的运行状态
  在实际测试当中,在日志中发现的最多种的状态(除了MISS以外的)是:
TCP_REFRESH_HIT:指squid发现cache中存在资源的拷贝,但不知是否新鲜的,向realserver发起了一次确认,realserver指出该拷贝是新鲜的
  TCP_IMS_HIT:指浏览器向squid发起请求,squid指出浏览器本地cache是新鲜的
  TCP_MEM_HIT:指squid在cache中发现存在资源的拷贝,并返回给浏览器
  除了下面两种状态以外,其他都应该是未命中状态。下面介绍一款squid命中率监控软件squid-graph
  下载包:http://sourceforge.net/pro...
  解压后直接就可以使用。但是需要perl的gd的支持
  GD的安装:http://stein.cshl.org/www/...,下载后解压
  perl makefile.pl
  make
  make install
  接下来,编辑apache的配置文件,加入访问路径
  Alias /squid-graph /var/www/squid-graph
Order deny,allow
Allow from all
  弄好上面的步骤以后,我们要利用工具开始分析日志
  ./squid-graph -o=/var/www/squid-graph/ < /var/log/squid/access.log
  具体命令的意思就不多说了
  分析完成以后就可通过http://ip/squid-graph来进行查看squid的命中率统计了。
2.squid的cache存储结构
3.如何查看squid当前的运行状态
四.技巧学习
1.注意观察日志文件,日志文件中有状态码,可以协助你判断此时cache的性能   
版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141171-1-1.html 上篇帖子: Squid优化完全手册(2) 下篇帖子: squid Aiops.c多线程IO理解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表