Squid代理服务3.1版本的配置和使用简介

Squid是一个单进程的异步代理缓存服务器,支持HTTP,FTP,GOPHER,ICP等协议。通过配置,可以实现反向代理、透明代理的功能,并且支持缓存,是实现高性能网站的必备基础设施之一。通常部署在应用服务器的前端。

Squid的安装就比较简单,可以yum安装或源码安装,安装完之后,配置在/etc/squid/目录下。

1 命令行参数
-a port 同配置中的http_port
-f file 指定使用的配置文件,默认为/etc/squid/squid.conf
-k      此命令有多个选项,行为是重新加载配置,将选项发送给进程实例
   reconfigure  重新载配置
   rotate       切换日志
   shutdown     关闭
   kill         终止
   check        检查
   parse        分析日志
-s       将日志输出到syslog
-z       初始化缓存目录
-N       非daemon模式运行


2 配置说明

最新配置项说明索引: http://www.squid-cache.org/Doc/config/
一个分类的指令索引: http://www.visolve.com/squid/squid30/contents.php
2.6版本的权威指南:  http://blog.s135.com/book/squid/

下面说明核心的指令作用,并针对反向代理(加速)场景进行示例说明。

2.1 http_port 
格式:http_port [host/ip]:port [option]  
用于指定服务监听的端口和模式,可以指定多个地址。
有如下可用的选项
accel               加速模式,必须至少配置vhost/vport/defaultsite 选项

模式支持accel intercept tproxy ssl-bump

加速模式的选项如下:
defaultsite=domain 设置HTTP HOST头的域名,访问虚拟主机时必须设置
no-vhost  禁用HTTP的HOST头
vport    使用HTTP_PORT指定的端口进行连接,而非HOST头中的端口
vport=NN 使用此处指定的端口进行连接,而非HOST头中的端口
allow-direct 加速模式下允许直接转发请求

2.2 acl
格式:acl name type parm... 多个参数之间为OR的关系,也可以将多个参数写成多行,使用同一个列表名称即可。
由于在处理时,会针对一系列列表进行匹配对比,因此参数的顺序及表示方式对性能有较大影响,将最有可能的匹配放在头部可以减少延时 。范围不要重叠,否则会导致出错。
squid有25种type,常用的类型及功能作用列举如下:
名称
作用
示例
备注
src/dst
指定控制源或目标的IP地址列表
acl localnet src 192.168.1.0/24
acl localnet src 172.16.10.0-172.16.19.0/24      
地址控制勿用主机名,解析比较慢,主机对应IP变化后会失效,要使用srcdom等;
srcdomain
dstdomain
指定源或目的的域名列表
acl servers dstdomain  .baidu.com
.作为通配符,它匹配此域的任何主机域,包括域名自身。无.则为精确匹配。
srcdom_regex 
dstdom_regex
url_regex
urlpath_regex
ident_regex      
proxy_auth_regex
req_mime_type          
指定按照指定的字段
进行正则表达式的匹配
acl servers dstdom_regex -i baidu 
支持一些参数,如-i 大小写不敏感;
ident/ proxy_auth

支持身份过滤
acl auser ident proxy

port 支持端口的过滤
acl SafePort port  80 8080 8000
端口比较适合用范围来表示,通常
myip/myport
指定squid服务器的地址与端口 acl aport myport 80
acl pport myport 3128
myip用于在系统有多个接口时指定自己的IP
myport用于squid在多个端口上监听时指示不同PORT
method
支持HTTP请求方法的过滤
acl Uploads method PUT POST

proto
支持不同协议的过滤
HTTP/HTTS/FTP等
acl ftpcl proto ftp

maxconn
指定每个IP的最大连接数
acl MaxCon maxconn 10

arp
检测客户端的MAC地址
acl mybox arp 00:10:20:30:40:50

如果有一个很长的ACL列表,则可以分类写在不同文件中,通过 acl 指令包含多个文件即可。
acl name "filename"

2.3 http_access
格式:http_access allow|deny aclname ...
设置接受或拒绝哪些alc设置的请求条目,对于一行中的多个acl是and的关系,即均要满足。多行http_access之间会顺序执行,只到有一条满足,则不再向下匹配。因此控制链的顺序也会对性能产生一定的影响,最常见的访问请求,最好列于控制链的顶层。
示例1   只允许192.168.0.0/16内网访问3128的代理服务
acl localnet src 192.168.0.0/16
acl  ProxyPort   port 3128
http_access allow localnet ProxyPort
http_access deny localnet

示例2  在示例1的基础上增加端口80的反向代理功能
acl AccelPort  myport 80
acl ProxyPort  myport 3128
http_access allow AccelPort 
http_access allow localnet ProxyPort  

2.4 cache_dir
格式:cache_dir fs_type path size L1 L2 [option]
设置缓存使用的存储类型、位置及大小,大小按MB来计算。L1和L2分别指定path下的一级目录和二级目录的个数。
文件类型有:ufs aufs diskd null
ufs是一个同步写磁盘的版本,而aufs是一个使用线程的异步版本,即IO操作被线程池执行,执行结束后信号通知主线程。二者的文件存储结构一样,比较容易切换使用。diskd不使用线程,而是使用消息队列和共享内存的进程间IPC来实现磁盘操作。null类型用于指定不写磁盘,通常用来测试当前硬件的squid性能上限。
squid为每个缓存文件分配一个唯一的ID,并使用算法将ID和文件路径映射起来,一旦激活squid,再改变L1和L2会导致原有的文件无法访问到。
可用的选项:
read-only  用来设置某个缓存目录为只读,这用来迁移共享目录时比较有用
max-size   用于指定本存储目录中存储的最大目标的大小,单位为字节。多个cache_dir 行最好按照max-size由小到大排序。

2.4.1 cache_swap_low 
格式:cache_swap_low  N 
用于指定当缓存高于N时进行文件的删除,通常设置为90

2.4.2 maximum_object_size
格式:maximum_object_size N MB
用来指定支持缓存的最大对象的大小。当然如果所有的cache_dir设置的大小都比此值小,此仍然无法缓存此对象。

2.4.3 cache_replacement_policy
格式:cache_replacement_policy lru|GDSF|LFUDA...
用于指定cache的替换策略。不同的 cache_dir可以使用不同的策略,需要在这些cache_dir行的之前执行策略的设置即可。

2.4.4 删除缓存对象
关闭squid,然后删除缓存目录即可。如果文件很多,则删除过程会较长。较好的作法是进行重命名,然后创建新的cache目录并在初始化后重启。

2.5 cache_mem
格式:cache_mem N MB

2.6 cache_peer
格式:cache_peer hostname type http-port icp-port [option]
用于指定层次缓存结果的PEER节点位置及类型。多个cache服务器之间可以是父子关系或兄弟关系,区别在于父可以向子提供 cache未命中时的数据,而兄弟之间不能这样做。
hostname用于指定主机名,不能在邻居之间使用相同的主机名,即使其端口不同。运行期间,squid会不断探测主机名对应的IP地址。
type用于指定cache的类型,有parent sibling 和multicast
port用于指定端口,如果为0,则为禁用,然而应该使用no-query选项来禁止这些协议。

通常选项:
proxy-only 不存储来自邻居的响应数据
connect-timeout
connect-fail-limit=N
allow-miss
max-conn = N
name=xxx

认证选项
login=user:pass
connection-auth=on|off

反向代理选项:
orignserver  指定此peer为源web服务器
forceddomain 指定为HTTP HOST头设置的域名
no-digest    对URL不计算摘要

peer选择方法及选项:
default 
round-robin
weighted-round-robin
userhash
sourcehash
multicast-siblings

2.6.1 cache_peer_access
格式:cache_peer_access cache_host allow|deny aclname ...
定义对邻居cache的访问列表。可以决定哪些请求通过或禁止发送到邻居。
例如,只允许HTTP的请求发给peer192.168.1.1
cache_peer  192.168.1.1 parent 3128 0
acl HTTP proto http
cache_peer_access 192.168.1.1 allow HTTP

2.6.2 cache_peer_domain
格式:cache_peer_domain cache-host domain [...]
定义可将请求发送到哪些域名的邻居

2.6.3 never_direct
格式:never_direct allow|deny  aclname
指定不需要发给源服务器的请求的ACL。通常是发给父cache。例如squid要经过防火墙,而不是直接代理外部站点,此时要使用never_direct设置必须经过防火墙的请求。

2.6.4 always_direct
格式:always_direct allow|deny  aclname
指定总是要发给源服务器请求ACL。

2.6.5 hierarchy_stoplist
格式:hierarchy_stoplist [word] ...
指定一些串,匹配这些串的请求将不会被转发给peer。此选项会被never-direct覆盖。

2.6.6 prefer_direct
格式:prefer_direct on|off
默认请求先转发给邻居,后才给源。打开此选项,可以反转这个顺序。

2.6.7 控制的组合与决策


2.7 forwarded_for
如果为on则会添加客户端的IP地址到HTTP请求头中。
X-Forwarded-For:192.168.1.2。如果为OFF,则IP为unknown。
设置为transparent,则不进行任务操作;设置为delete,则删除X-Forwared-for头。

2.8 refresh_pattern
格式:refresh_pattern [-i] regexp min percent max [option]
用于指定哪些请求从缓存中读取,哪些直接从上游请求。
-i 用于指定regexp是否为大小敏感的
min  用于指定某个响应被cache的最短分钟数,如果低此则不过期。
max 用于指定某个响应被cache的最长分钟数,超过则立即过期。
在min和max之间的时段内,squid根据源服务器回应头中的last-modified和date的值计数一个修改系数,如果此系数小于refresh_pattern中指定的percent,则存活,否则过期。
例如:
refresh_pattern  -i \.js$ 30 50% 1440

2.9 其他控制规则
除了在2.3节中的http_access还有其他几种类型的访问控制
http_reply_access  基于服务器返回进行控制
icp_access 用于控制icp协议的访问
no_cache  用于控制不缓存的访问
cache_peer_access 控制发送到邻居cache的HTTP请求和ICP/HTTP查询
header_access   配置删除某些HTTP头部
header_replace  配置远的某些HTTP头部
在 http://home.arcor.de/pangj/squid/chap06.html#a0下有不同控制的示例。

2.9 日志
squid有三个日志,cache.log access.log与store.log,cache日志包含状态和调试信息,access日志包含访问者的信息。store日志记录了访问cache的一些信息。
通过下面的指令可以指定日志文件的路径。
cache_log path
cache_access_log path
cache_store_log path

3 示例
3.1 普通代理
普通代理下,浏览器发送完整的请求给代理服务器,形如 GET HTTP://www.baidu.com
Squid在收到这些请求后,进行解析,转发到指定请求的域服务器上,并将接收到的数据返回给客户端。

3.2 反向代理
必须使用accel模式,此时浏览器发送的请求为解析后的请求,形如:GET / 
Squid在收到这些请求后,转发给配置文件中指定的真正的web服务器或上层代理服务器,并将接收到的数据返回给客户端。

场景1:有一台外网的web服务器,页面中有较大的js文件及图片,除了这些页面,其他页面访问速度还可以接受,但这些大页面的打开让人无法忍受。为了让内网用户能更好的使用这个web服务,在内网搭建一个squid的反向代理,为内网1网段的用户提供加速。


场景2: 通过Squid+DNS实现多站点代理
首先在本地网络的DNS中将example1/2的域名覆盖为Squid服务器的地址
然后配置sqiud,针对不的源站点应用不同访问acl。
Squid代理服务3.1版本的配置和使用简介_第1张图片
3.3 透明代理
此种方式不需要配置客户端的浏览器,只需要配置整个网络的出口的路由器或交换机,将流量按规则导入到squid上。实施时需要按网络的具体结构及设备型号来考虑,不在此说明。

4 有用工具
squidclient提供了管理和查看squid运行状态的方式。

-r url  重新加载指定url的缓存,即令历史数据失效
-m uri 删除指定的uri缓存,需要配置acl允许此操作,默认拒绝,注意只支持单个对象,一组对象,需要从access.log中查找过滤并使用此指令。清空所有cache的方法重命令原有cache目录,再启动squid生成新空缓存。
squidclient -p 3128 mgr: 可以列出其所支持众多的命令
info 列出了基础信息
mem  列出了内存使用
objects 列出了缓存列表
diskd  列出了磁盘使用情况



你可能感兴趣的:(代理服务器,squid)