squid反向代理作web加速-配置详解

基本概念

squid反向代理作web加速是大型网站的常用模式。
1. squid来自于1990的cache harvest项目。
这个项目一个分支形成squid,另一个形成netapp的netcache产品(netapp的netcache是固化在其硬件产品中的,整体价格很贵)
2.squid是硬盘缓存,其使用内存作缓存内容的索引
(一个索引在32位系统中大小是75bytes,在64位系统中是112bytes)。
可以把squid想象成数据库,硬盘上是数据,内存中是索引:查询内存索引,发现内存位置,发出去。
3.产品下载及说明( http://download.opensuse.org/repositories/server:/proxy/)
a)Squid:不用说了,就是squid的主程序
b)SARG的全称是:Squid Analysis Report Generator,SARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访问量等。
如果做反向代理,sarg可以不安装。这个工具对正向代理更有价值。
c)SquidGuard:重定向器,可以重写用户的uri,类似apache的mod_rewrite。关于重定向器,我建议少用,可能会降低性能。

性能要素

squid反向代理作web加速器时需要关注的系统性能因素主要是:

一. 硬件:
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小的盘,而随机寻道时间短意味着转速要快,越快其随机寻道时间越短!

4.关于Swap:
毫不犹豫地关闭swap,squid是个大进程,使用swap只能使性能下降

二. 适合的ϖ作系统:
能够支持posix线程实现异步io的ϖ作系统,如:linux2.6内核的系统

三. 适合的文件系统:
reisfer文件系统,处理大量小文件(一般的网页缓存都是小文件),性能最佳

四. 每个squid对应专门应用,写明httpd_accel_host避免dns查询,dns查询很消耗时间

五. 配置尽量使用IP,不用域名,加快访问速度(如多台缓存服务器/后台服务器等)

目录和命令

一. squid的默认目录:

1. 配置文件 /etc/squid/squid.conf

2. 缓存目录 /var/cache/squid/

3. 日志目录 /var/log/squid

4. 命令文件 /usr/sbin/ 一系列以squid开头的文件

5. 启动脚本 /etc/init.d/squid suse已默认建好,修改ulimit -n 4096为60000
当打开多个缓存文件时,需要更多的文件句柄。注意,linux存在系统文件句柄总数和单进程文件句柄总数,此处修改的是单进程的文件句柄总数,如果要打开更多文件,建议修改系统文件句柄总数(对于suse10,一般是不用的)

6. PID文件 /var/run/squid.pid

7. 其他实用程序 /usr/lib/squid

二. squid 启动命令:
1. squid -k function 指示squid执行不同的管理功能,reconfigure, rotate, shutdown, interrupt, kill, debug, check, or parse.
(1).reconfigure导致运行中的squid重新读取配置文件,有些配置的修改需要重启squid(如修改缓存参数)
(2).rotate导致squid滚动它的日志,这包括了关闭日志,重命名,和再次打开它们
(3).shutdown发送关闭squid进程的信号
(4).interrupt立刻关闭squid,不必等待活动会话完成
(5).kill发送KILL信号给squid,这是关闭squid的最后保证
(6).debug将squid设置成完全的调试模式,假如你的cache很忙,它能迅速的用完你的磁盘空间
(7).check简单的检查运行中的squid进程,返回的值显示squid是否在运行
(8).parse简单的解析squid.conf文件,如果配置文件包含错误,进程返回非零值
2. squid -z 初始化cache,或者交换cache目录。在首次运行squid,或者增加新的cache目录时,你必须使用该选项。
在该阶段属主和许可权是通常遇到的问题。squid在特定的用户ID下运行,这在squid.conf文件里的cache_effective_user里指定。用户ID必须对每个cache_dir目录有读和写权限。squid -zX 显示初始化过程
3. squid -s 以服务方式启动squid
4. squid_start脚本 使用绝对或相对路径启动squid时,squid会启动子进程运行此脚本以执行一些ϖ作
5. /etc/init.d/squid start/stop/status/probe也用于管理squid(suse专用方式)
6. Squid -NCd1 检查配置和当前运行情况

结构设计

squid反向代理作web加速的结构设计:

1. 单独的squid服务器和apache服务器,默认访问squid服务器

2. 最好最快的方式:配置路由器/交换机成HTTP拦截,例如,可以配置离原始服务器最近的路由器或交换机,拦截HTTP请求,将其驱向squid。

3. 如果预算有限,可以将squid和apache放在同一机器上(如果资源有限),但这2个应用不能共享相同的IP地址和端口号。必须将后台服务绑定在不同的地址(例如apache监听127.0.0.1)或将它移到另一个端口。
这种情况下,最好指定apache绑定到端口81-不容易出问题(设置防火墙只开放80口),也较为安全(apache也可以listen 127.0.0.1:80,但容易与acl的部分规则相矛盾导致无法访问)

具体配置1

http_port port/ hostname:port/ 1.2.3.4:port [option] 取代了http_accel*(这种方式仅在2.6中可用),

模式说明:
使用主机名或ip可将squid绑定到专门的主机上,一般不用;
option 说明:
accel 表示http加速器模式,需要至少一个vhost/vport/defaultsize参数
defaultsite=domainname 如果http头中没有host,则将defaultsize作为默认的host
vhost 加速器支持host header方式的虚拟主机
vport 加速器支持基于ip的虚拟主机
protocol 加速器要处理的请求协议,默认http
http_port 80 accel vhost vport 相当于:
http_port 80
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on
httpd_accel_single_host off
httpd_accel_with_proxy on
考虑配置http_port 80 accel defaultsite=127.0.0.1
同样,使用https port 类似上面的配置处理https代理

具体配置2

1. cache_peer 设置与其它cache机的通讯,也处理加速方式的核心设置
cache_peer hostname type http-port icp-port [options]
no-query 不发送icp信息包到此机器,一般设置原始主机用(如果是cache机,则需要互相发送icp包验证存在性)
originserver 指定此机为原始内容服务器,用于加速模式
type: either 'parent'(父亲), 'sibling'(兄弟), or 'multicast'(广播——最好不用).原始服务器配成parent

2. cache_peer_domain 限制/指定用户访问的邻居cache域,类似cache_peer_access,cache_peer_domain europe-cache.org parent .ch .dk .fr 以fr/dk/ch结尾的域名访问europe缓存

3. cache_peer_access cache-host allow|deny [!]aclname 类似acl,对cache机器进行访问控制,一般不用。例子:cache_peer_access 192.168.0.249 allow HTTP


具体配置3

一些杂项设置:
1. always_direct 告诉squid某些请求必须直接转发到原始服务器,如put/post
acl OurNetwork src 172.16.3.0/24
always_direct allow OurNetwork

2. never_direct 对从来不必直接发送到原始服务器的请求的访问列表,一般用always_direct,不用这个

3. dead_peer_timeout(seconds) 证明一个cache机已死的时间(发送icp包),默认10s

4. hierarchy_stoplist 它包含一个字符串列表,当在URI里发现它们时,squid将请求标记为不可层叠,squid直接发送不可层叠的请求到原始服务器。hierarchy_stoplist ? cgi-bin

5. prefer_direct on 先发送请求到原始服务器,连不上再发送到邻居cache,默认off

6. netdb 是squid存储/衡量cache服务器远近的数据库,使用ttl/hops

7. ICP是轻量级的目标定位协议(Internet Cache协议),ICP客户使用ICP响应里的信息来做转发决定。除了指示cache命中,ICP也用于提供关于squid和邻居cache之间网络条件的线索,ICP消息类似于ICMP ping

具体配置4

squid Cache摘要(Cache Digest),为了提高squid转发速度。在squid中,邻居的摘要完全存放在内存里。在一个典型的摘要里,每百万目标需要大约625KB的内存。
Squid会下载邻居的cache摘要,存在自己的内存中

配置内容:
no-digest选项,用于cache_peer指令,不下载邻居的cache摘要
digest-url=url选项允许你配置邻居的cache摘要URL
digest_generation指令控制squid是否产生自己的cache摘要,如果是子节点就不用了
digest_bits_per_entry决定摘要的大小。默认值是5,不用改(太大影响性能)
digest_rebuild_period控制squid重建摘要数据结构(并非HTTP响应)的频率。默认是每个小时1次,如果变化频繁就提高频率
digest_rebuild_chunk_percentage指令控制每次调用重建函数时,多少cache增加到摘要里。默认是10%
注意:建立摘要时系统响应能力会降低

具体配置5

squid refresh_pattern 配置:
第一种:refresh_pattern . 0 20% 4320 ignore-reload 忽略浏览器的“刷新”ϖ作(刷新ϖ作强迫squid调用新页面,增加服务器负荷),一般静态内容较多可以使用这个配置;

第二种:refresh_pattern reload-into-ims,这时不忽略刷新ϖ作,squid会比较cache是否过期,需要页面有cache验证选项(例如Last-Modified时间戳或Expires),所以必须在页面中写清cache要求/时间,主动控制!动态内容可以使用这个配置。

第三种:refresh_all_ims off 开启意味着squid在客户刷新是都检查原始服务器的页面更新时间,关闭表示squid仅根据cache版本决定是否访问原始服务器,默认off。
如果对数据的时效要求很高,则开启这个选项。


具体配置6

这是一些杂项配置:
1. client_db off 不根据每个用户生成统计信息,默认on。
对于反向代理,最好关闭,你不必为每个用户都生成统计信息。

2. 负责均衡(多台后台主机):对多个IP地址的后台服务器创建一个DNS名字。对每个cache丢失,squid会轮循请求所有后台地址,
(为提高dns解析的速度,可以禁用squid的DNS解析,然后根据本地的/etc/hosts文件根据请求的域名进行地址转发,而后台多个服务器必须使用相同的端口)
或使用重定向器,如squidguard

3. 如果服务于协商响应,使用标准的Vary头部,以便所有的用户代理知道什么在进行

4. 超文本cache协议(HTCP),一般不用

具体配置7

这些配置仅用于suqid2.6,squid3.x不再使用了。

1. http_port 80 侦听80端口

2. https_port 配置squid来处理加密的HTTP(SSL和TLS)连接。squid解密来自客户端的SSL/TLS连接,并将未加密的请求转发到后台服务器,格式:
https_port [host:]port cert=certificate.pem [key=key.pem] [version=1-4] [cipher=list] [options=list]
https_port 443 cert=/usr/local/etc/certs/squid.cert
注:如果编译安装,该功能要求在运行./configure时,激活--enable-ssl选项。

3. httpd_accel_host 指定squid后台服务器的IP地址或主机名
httpd_accel_host 127.0.0.1 访问IP
httpd_accel_host squidbook.org 访问后台主机的域名

4. httpd_accel_port squid后台服务器的端口号。默认是80
httpd_accel_port 80
注:在多个端口上加速原始服务器,可以将该值设为0。在该情形下,squid从Host头部里获取端口号

5. httpd_accel_uses_host_header 控制squid如何决定它插入加速URI里的主机名。假如激活了,请求里的Host头部值,会优先于httpd_accel_host值。即如果客户端发送恶意的Host值,会使squid访问不正确的外部主机。不安全。如果加速多个域名,需要打开(但可以用dns转发,最好是不同的域名对应不同的主机,可能有的主机是不需要反向代理的)
httpd_accel_uses_host_header off 默认关闭

6. httpd_accel_single_host决定squid转发它的cache丢失(即没有对应cache的web请求)到哪里。如果打开,则会转发cache丢失到httpd_accel_host的主机(不考虑uri中的host);反之,会发送cache丢失到uri中的host。
httpd_accel_single_host on 打开意味着cache丢失时不用根据uri中的host进行dns查询,直接连后台服务器。默认off,但打开时一定不要同时打开httpd_accel_uses_host_header

7. httpd_accel_with_proxy off 让squid不再处理正向代理服务

Mem Cache

squid 的Mem Cache参数设置:

1.cache_mem 128 MB squid使用的其它内存上限,用于传输中的对象/热对象/非缓存对象(有点像linux的硬盘缓存,他们都存成4kb的块,这样可以提高传输速度),默认8MB,传输中的对象优先级最高。
注意:这个值要参考硬盘缓存所使用的内存和总内存量确定,设定大,则缓存的热内容多,但硬盘缓存的内容就少了。(估算一下最热内容占多大空间再决定)
2.maximum_object_size_in_memory 16 KB 对象的最大尺寸,超过不会被放入内存,默认8KB,根据网站网页一般的尺寸设置大小,最好是4kb的倍数
3.memory_replacement_policy lru 内存替换策略,默认LRU,不用改
4.memory_pools on squid预先分配一定的内存用于cache,以提高效率,默认on;如果os内存管理很高效,可以off
5.memory_pools_limit 5 MB squid在memory_pools中保存的预分配(未使用的)内存的上限,当pools开启时有效,0表示不限制大小,最好设一个的值,大些,以保证内存效率,实际不一定会用到这个值,默认5MB。这个值可以设置为64-128MB,squid会根据需求占用之。

Disk Cache设置

squid的Disk Cache参数设置:
1.尽量不用层叠cache(多级cache),效果不好

2.cache_dir告诉squid以何种方式存储cache文件到磁盘的什么位置。
cache_dir scheme directory size L1 L2 [options]
scheme 选择不同的存储机制,默认ufs
directory 缓存对象文件存放在这个目录下,可以设置多个,
[建议:每个物理磁盘中,仅仅设置一个cache目录]
size 指定了cache目录的大小(Mbytes),是squid能使用的cache_dir目录的空间上限。推荐保留10%的空间。这些额外的空间用于存放squid的swap.state文件和临时文件。
[如果磁盘主要用于cache,可以使用空闲大小的90%进行cache;此外还要考虑对应的内存大小,如果这些缓存的内存索引大于可用内存,squid性能大大受损!]
Inodes(i节点)是unix文件系统的基本结构,对linux没用!(指文件块大小,linux使用4k,察看命令df -ik)
L1和L2 1级目录和2级目录的数量,默认的是16和256,如果cache文件小,减少L1和L2以提高速度。squid让HTML文件和它内嵌的图片更可能的保存在同一个二级目录中。而且,一旦激活cache目录就不要更改L1 L2。
[cd /cache0; du -k 察看缓存目录空间]
Options的read-only,只读,用于cache目录迁移,一般不用
Options的max-size 指定存储在cache目录里的最大目标大小,字节单位,最好不要设置。假如设置了,必须将所有cache_dir行以max-size大小顺序来存放(从小到大)。

3.cache_swap_low 90
cache_swap_high 95
数字值是最大cache体积的百分比。如果总共磁盘使用低于cache_swap_low,squid不会删除cache目标。如果cache体积增加,squid会逐渐删除目标。

4.maximum_object_size 100 KB 比此值更大的响应不会被缓存在磁盘,如果没有这样的对象最好不设置!(设置多了增加squi的负荷)
minimum_object_size 这个一般不用设置

5.cache_replacement_policy 控制了squid的磁盘cache的置换策略,默认LRU(最少近期使用被替换),性能最好,不用再设置了

6.squidclient reload缓存目标(当缓存文件发生问题时使用的指令),
squidclient -r http://www.lrrr.org/junk /tmp/foo;
squidclient -m PURGE http://www.lrrr.org/junk 删除指定目标

7. 删除所有对象:必须停止squid,ϖ作如:
# squid -k shutdown
# cd /usr/local/squid/var
# mv cache oldcache
# mkdir cache
# chown nobody:nobody cache
# squid -z
# squid -s
# rm -rf oldcache &

8. refresh_pattern帮助squid决定,是否某个给定请求是cache命中,或作为cache丢失对待。仅应用到没有明确过时期限的响应,如对图片的请求。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。要使用正则验证,估计影响性能,可以不设置

访问控制 acl指令

squid访问控制的acl 指令配置:
acl是squid用于控制访问的专用指令,其模式也很简单:
acl mymode
http_access deny mymode
或 http_access allow mymode
等等。但要注意,如果定义了很多访问规则,则squid会按前后顺序执行这些控制,所以规则的逻辑顺序很重要,否则会引起安全问题或造成访问失败!

1.squid在启动时,将主机名转换成IP地址。一旦启动,squid不会对主机名的地址发起第二次DNS查询。这样,假如在squid运行中地址已改变,squid不会注意到。

2.当ACL域名以"."开头,squid将它作为通配符,它匹配在该域的任何主机名,甚至域名自身。相反的,如果ACL域名不以"."开头,squid使用精确的字符串比较

3.dst类型指向原始服务器(目标)IP地址,src类型指客户源IP地址。srcdomain 源域,dstdomain目标域,配置如:
acl myhttpserver dst 1.2.3.0/24 或192.168.0.3 可以写多行此代码指定多个服务器
http_access deny !myhttpserver

4.port ACL:限制对某些原始服务器端口号的访问。Squid如果不连接到某些服务,例如email和IRC服务,port ACL允许你定义单独的端口或端口范围。例如:
acl HTTPports port 80 8000-8010 8080
这是安全的配置方式:
acl Safe_ports port 80 # 仅访问原始服务器的80端口
http_access deny !Safe_ports#

也可以指定危险端口:
acl Dangerous_ports 7 9 19 22 23 25 53 109 110 119
http_access deny Dangerous_ports

注意:如果指定危险端口,由于每次访问squid都要查询端口是否安全,使用危险端口的查询工作量大于指定安全端口,尽量不用

5.myport ACL:限制squid的可访问端口,安全的配置方式:
acl AccelPort myport 80
http_access deny !AccelPort

6.method ACL指HTTP请求方法,常用的有GET/PUT/POST/HEAD,CONNECT方法危险(会被利用访问远程服务器,但SSL会用到),设置:
acl CONNECT method CONNECT
acl SSL_ports 443
http_access allow CONNECT SSL_ports
http_access deny CONNECT

Purge是squid的专有方法,控制缓存,危险,设置:
acl Purge method PURGE
acl Localhost src 127.0.0.1
http_access allow Purge Localhost #仅在本地使用
http_access deny Purge

7.proto指URI访问(或传输)协议,常用http, https (same as HTTP/TLS), ftp,只允许http/https的配置:
acl webproto proto HTTP HTTPS
http_access deny !webproto
cache_object是squid专有的控制缓存的协议,只能在本地用:
acl Manager proto cache_object
acl Localhost src 127.0.0.1
http_access allow Manager Localhost
http_access deny Manager
注意,这要写在上面的http配置前边

8.maxconn ACL指来自客户IP地址的大量同时连接,可以配置为:
acl OverConnLimit maxconn 4
http_access deny OverConnLimit # maxconn ACL在请求超过指定的数量时,会匹配这个请求,所以用deny方式

9.包含外部文件:如果配置参数很多很长,可以使用外部文件,如:
acl Foo BadClients "/usr/local/squid/etc/BadClients" #ip 地址要一行一个

10.常用的访问控制规则:
http_access allow/deny 允许/拒绝
no_cache allow/deny不必存储某些响应,注意使用deny才表示“不缓存”
miss_access列表主要用于squid的邻居cache。它决定squid怎样处理cache丢失的请求。如果squid使用集群技术,那么该功能必需
always_direct 请求匹配allow规则时,squid直接转发请求到原始服务器
cache_peer_access 控制发送到邻居cache的HTTP请求和ICP/HTCP查询
header_access 配置squid从它转发的请求里删除某些HTTP头部。如,你也许想过滤掉发送到某些原始服务器的请求里的Cookie头部

**注意:把最可能匹配的值放在列表开头处,能减少延时;少用正则表达式

磁盘IO瓶颈与优化

squid的磁盘IO瓶颈与优化:

1.现象:不使用cache时,平均响应时间明显更好,那么可以确认磁盘I/O是该水平吞吐量的瓶颈

2.硬件:不用raid(并不能带来明显性能提升,而且大大增加系统的风险),最好是独立文件系统+独立硬盘

3.在/etc/fstab中使用使用挂载参数:noatime(不记录文件访问时间),async(异步IO)

4.使用超过你需要的更大磁盘,并且仅仅使用空间的一半,空间越多写性能越好;不行就减少cachedir的大小

5.文件系统方式:
1)UFS(squid默认的文件系统方式)性能较好,实时读写。
2)aufs使用异步多线程方式管理缓存读写,在多CPU系统上优势更明显,一个cachedir默认16个线程,需要posix线程系统,稳定性不如ufs,使用Aufs命令:
cache_dir aufs /cache0 4096 16 256
运行tail -f store.log看是否有文件写入磁盘,监控之。
注意:aufs要使用大量文件描述符,注意系统设置(用ulimit命令查看修改,对于suse10一般不用修改系统文件句柄数,仅需要修改进程文件句柄数量)
3)Diskd 使用消息队列实现异步io,还要修改内核参数,不如aufs稳定
4)Coss 用一个大文件存储全部cache,小型squid系统,试验性的
5)null 用于测试squid性能使用,必须指定cache_dir /tmp null

总结:
如果并发不高( 6),使用ufs就ok;
高并发,可以使用aufs(aufs在Linux和Solaris上运行良好)。
而且,同一服务器不要使用不同的缓存机制,cache的大小最好相同。

6.使用reisfer文件系统

你可能感兴趣的:(squid)