Squid 操作实践


  • Squid简介

  • Squid可以做什么

  • 性能要素

  • Squid安装

  • Squid快速体验

  • Squid配置


Squid简介

Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator. It runs on most available operating systems, including Windows and is licensed under the GNU GPL

翻译过来大致意思:

 Squid是一个支持HTTP,HTTPS,FTP等众多协议的缓存代理。可以降低带宽 和 提高响应时间


squid是硬盘缓存,其使用内存作缓存内容的索引
(一个索引在32位系统中大小是75bytes,在64位系统中是112bytes)。
可以把squid想象成数据库,硬盘上是数据,内存中是索引:查询内存索引,发现内存位置,发出去


性能要素

  1. 大内存(最重要,影响最大);快速大硬盘(第二要素,更多缓存,看网站实际数据量了,要快速的,最好是1万转以上的,如sas10K或西部数据的猛禽系列);CPU(较为次要,影响不大,特别是多核处理器基本没用)。

  2. 建议匹配配置:每G磁盘空间需要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。你的情况当然会不同。
    内存需求依赖于如下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,和你使用的特殊功能。估算:建立一个有足够磁盘空间,可存储 3-7天web流量数据的系统。如带宽1M,则需要约3600*1M的数据缓存(3.5G),如果一天提供8小时有效访问,则需要缓存10-28G(看重复情况了)。但Squid官方网站说法:squid使用内存表索引硬盘缓存内容,硬盘内容/内存索引=177,但要同时考虑到squid程序内存,cache_mem,硬盘缓冲cache等占用的内存。因此,我的估算:2G内存的系统,使用1.5G内存作squid索引,对应硬盘150G。

  3. 关于硬盘说明:requests per second = 1000/seek time/硬盘数,一块硬盘是比较准确的,多块硬盘就不好说了。一定要用random-seek time小的盘,而随机寻道时间短意味着转速要快,越快其随机寻道时间越短!

Squid可以做什么

squid可以做代理,也可以做防火墙,也可以提高是网站加速器,节省服务器带宽资源(为公司省钱)


Squid安装

本人操作系统Ubuntu12.04(使用vagrant创建的虚拟机)


$ sudo apt-get install squid3
$ sudo service squid3 stop/restart


Squid快速体验

先备份默认配置文件

$ sudo cp /etc/squid3/squid.conf /etc/squid3/squid.default.conf


配置接受请求(默认不接受任何请求)

$ http_access deny all  修改成  http_access allow all


给代理起个名字(搜索visible_hostname )

$ visible_hostname testProxy
$ cache_mgr admin@54php.cn


设置dns服务地址 : 打造私有的DNS 服务


$ vim /etc/squid3/squid.conf #search dns_nameservers
dns_nameservers 192.168.22.24 192.168.22.25


重启服务

$ sudo service squid3 restart


然后找个浏览器设置HTTP代理地址 和  端口(默认3128)

Squid配置

文件和日志相关配置

#指定cache在硬盘上存放的路径,最大存储40G,16个一级目录,256个二级目录
#修改完cache_dir路径重启之前要squid3 -z
cache_dir ufs /data/logs/squid3/cache  40960  16 256 

#squid启动和调试等信息
cache_log /data/logs/squid3/cache.log 

#squid请求日志
access_log /data/logs/squid3/access.log squid 

#记录进入和离开缓存的每个目标的记录
cache_store_log /data/logs/squid3/store.log


cache_mem  2048 MB           #squid使用共享内存大小,一般设置为内存1/3左右
cache_swap_low 85            #配合cache_mem使用,当达到百分之85后,就把旧的内容替换直到降到百分之85
cache_swap_high 95

#日志保留最近30个文件,每天轮询三次,即保留最近十天的内容.

logfile_rotate  30


访问控制(重点)关键字 acl http_access

acl 语法,每一行的访问控制都必须有 名字 和 类型,如下

acl aclname acltype param


常见acltype列表


类型描述
例子
src客户端ipacl aclname src  192.168.22.21  192.168.22.0/24
dst目标ip,既访问URL的ipacl aclname dst 220.181.57.217 220.181.57.0/24
arpmac地址acl aclname arp 08:00:27:dd:97:09
srcdomain
没想到应用场景
dstdomain目标服务器域名acl aclname dstdomain   .foo.com
srcdom_regex正则表达式没想到应用场景
dstdom_regex正则表达式acl aclname dstdom_regex [-i] \.foo\.com
url_regex访问url正则acl aclname url_regex [-i] ^http:// ...
urlpath_regex访问path正则acl aclname urlpath_regex [-i] \.gif$
port目前端口
acl aclname port 80 70 21 0-1024
proto协议acl aclname proto HTTP FTP ...
http_statushttp 状态acl aclname http_status 200 301 500- 400-403 ...
method
acl aclname method GET POST ...
browseruser-agent匹配acl aclname browser [-i] regexp ...
referer_regexreferer匹配acl aclname referer_regex [-i] regexp ...
req_mime_type请求mine类型

acl aclname req_mime_type -i ^multipart/form-data$

acl aclname rep_mime_type -i ^application/x-javascript$


http_access 语法格式

http_access allow|deny [!]aclname


结合acl  和 http_access 举例

acl white_ip_list  src 192.168.22.0/24
acl deny_domain dstdomain .qq.com .taobao.com  
http_access deny deny_domain #等价于http_access allow !deny_domain
http_access allow white_ip_list


refresh_pattern的作用

主要用于一个页面进入cache后,它在cache中停留的时间。refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限

#语法
refresh_pattern [-i] regexp min percent max [options]

min参数就是分钟数,它是过时响应的最低时间限制,如果某个响应驻留在cache里的时间没有超过这个最低限制,那么它不会过期


max参数也是分钟数,它是过时响应的最高时间限制,如果某个响应驻留在cache里的时间高于这个最高限制,那么它必须被刷新


在最低和最高时间限制之间的响应,会面对squid的最后修改系数LM-factor算法LM-factor=(response age)/(resource age)


options可能值如下

override-expire
该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期

override-lastmod 
改选项导致squid在检查LM-factor百分比之前先检查min值

reload-into-ims 
该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。 
一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间

ignore-reload 
该选项导致squid忽略请求里的任何no-cache指令。 
所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项,这个我们常用在mp3,wma,wmv,gif之类


reload-into-ims例子如下:

refresh_pattern -i .html 1440 50% 10080 reload-into-ims

refresh_pattern -i .htm 1440 50% 10080 reload-into-ims

refresh_pattern -i .shtml 1440 50% 10080 reload-into-ims

refresh_pattern -i .png 4320  50% 20160 reload-into-ims

refresh_pattern -i .gif 4320  50% 20160 reload-into-ims

refresh_pattern -i .bmp 4320  50% 20160 reload-into-ims

refresh_pattern -i .jpg 4320  50% 20160 reload-into-ims

refresh_pattern -i .js 4320  50% 20160 reload-into-ims

refresh_pattern -i .css 4320  50% 20160 reload-into-ims

refresh_pattern -i .swf 4320  50% 20160 reload-into-ims


ignore-reload例子如下:

refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload 
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload 
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload 
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload 
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload 
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload 


LM-factor

LM-factor=(response age)/(resource age) 
举个例子,这里只考虑percent, 不考虑min 和max 
例如:refresh_pattern 20% 
假设源服务器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00 
squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00 

1)如果当前时间 2007-04-10 03:00:00 
resource age =3点-2点=60分钟 
response age =0分钟 
index.htm还可以在cache停留的时间(resource age)*20%=12分钟 
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。 

2)如果当前时间 2007-04-10 03:05:00 
resource age =3点-2点=60分钟 
response age =5分钟 
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7 
LM-factor=5/60=8.3%<20% 

一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。 
如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过期, squid会向源服务器发一个index.htm是否有改变的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。 

如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算resource age,进一步计算出存活时间。 
实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认


cache_peer

cache_peer 语法格式

cache_peer hostname type http-port icp-port [options]
名称描述
typeparent,sibling,multicast
proxy-port
此处应该填写可以接受http请求的服务端口,squid服务常用端口是3128,web服务常用端口是80
icp-port
用于查询邻居cache服务中的对象,不支持icp或者HTCP的就设置为0
optionsno-query关闭icp查询,不做查询操作,直接获取数据

originserver原始服务器(web服务器)

no-digest关闭cache digests请求,代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)

proxy_only
直接获取对方缓冲,转交给代理服务器的客户端,而不存入本地

round-robin如果设置数部上层服务器,那么轮流查询父级服务器,此时weight参数才会起作用

sourcehash已客户端ip做负载均衡




直接转发到web服务器


从客户端过来的请求,如果是 blog.dr.local.com,则Squid向 Server 192.168.22.21 的端口80发送请求

从客户端过来的请求,如果是 admin.dr.local.com static.dr.local.com ,则Squid向 Server 192.168.22.24 的端口80发送请求

cache_peer 192.168.22.21 parent 80 0 no-query originserver weight=10 name=a
cache_peer 192.168.22.24 parent 80 0 no-query originserver weight=1  name=b

cache_peer_domain a blog.dr.local.com
cache_peer_domain b admin.dr.local.com static.dr.local.com


负载均衡配置

表明对blog.dr.local.com的请求,squid向192.168.22.21的80端口和192.168.22.24的80端口发出请求

cache_peer 192.168.22.21 parent 80 0 no-query  no-digest originserver weight=10 name=a  sourcehash
cache_peer 192.168.22.24 parent 80 0 no-query  no-digest originserver weight=1  name=b  sourcehash

cache_peer_domain a blog.dr.local.com
cache_peer_domain b blog.dr.local.com


日志


新缓存命中

TCP_HIT 

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

未命中

TCP_MISS

Squid没有请求资源的cache拷贝。

确认后命中

TCP_REFERSH_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

无命中返回现有缓存

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

刷新命中

TCP_REFRESH_MISS 

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

定义强制不缓存

TCP_CLIENT_REFRESH_MISS 

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

命中

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

缓存丢失直接访问源

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

误命中

TCP_NEGATIVE_HIT 

对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些
资源的重复请求,导致了否命中。negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定cache(也遵循于其他约束):204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

内存命中

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

access拒绝

TCP_DENIED 

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

异步刷新

TCP_OFFLINE_HIT 

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度

重定向

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS
预处理指令。


NONE

这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与cache命中、拒绝请求、cache管理请求、错误、和所有的ICP查询这些类型联合出现。


DIRECT

Squid直接转发请求到原始服务器。该域的第2半部分显示原始服务器的IP地址,或主机名
--假如禁止了log_ip_on_direct。



查询squid情况

$ sudo apt-get install squidclient
$ squidclient -p 3128 mgr:info


参考文章:http://www.squid-cache.org/

squid dns cache_peer refresh_pattern proxy reverse
编程浪子走四方:CodeRonin