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万转以上的,如sas10K或西部数据的猛禽系列);CPU(较为次要,影响不大,特别是多核处理器基本没用)。
建议匹配配置:每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。关于硬盘说明: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 | 客户端ip | acl aclname src 192.168.22.21 192.168.22.0/24 |
dst | 目标ip,既访问URL的ip | acl aclname dst 220.181.57.217 220.181.57.0/24 |
arp | mac地址 | 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_status | http 状态 | acl aclname http_status 200 301 500- 400-403 ... |
method | acl aclname method GET POST ... | |
browser | user-agent匹配 | acl aclname browser [-i] regexp ... |
referer_regex | referer匹配 | 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]
名称 | 值 | 描述 |
type | parent,sibling,multicast | |
proxy-port | 此处应该填写可以接受http请求的服务端口,squid服务常用端口是3128,web服务常用端口是80 | |
icp-port | 用于查询邻居cache服务中的对象,不支持icp或者HTCP的就设置为0 | |
options | no-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这个响应。在短时间内对这些 |
内存命中 | 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地址,或主机名 |
查询squid情况
$ sudo apt-get install squidclient $ squidclient -p 3128 mgr:info