Squid 操作实践

时间:2022-05-29 04:47:51
  • 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 客户端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这个响应。在短时间内对这些
资源的重复请求,导致了否命中。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 操作实践
标签:squid   dns   cache_peer   refresh_pattern   proxy   reverse

智能推荐