分类: LINUX
2009-07-30 10:14:43
[Squid 是什么]
Squid 是 Unix/Linux 服务器上最常用的代理服务器,它也有 Windows 的版本。可以用 Squid 简单的配置一个代理服务器,以实现:
1) 匿名或需要认证的 Internet 代理服务器。
2) 局域网内的代理服务器,用来共享 Internet 连接。
3) 反向代理,用来加速网站内容访问,实现网站访问控制,或者提供负载均衡。
4) 透明代理,与反向代理类似。
目前,我们仅仅需要使用 Squid 作为反向代理,加速我们的网站与平台的内容访问。
[配置原理]
首先需要了解代理服务器的几个概念:
1) 原始服务器 (origin server)
内容所在的服务器,一般代理服务器自动通过 DNS 服务来查找用户请求的原始内容服务器。而反向代理通常总是连接固定的一台或多台原始服务器。当用户请求的资源没有被代理服务器缓存,或内容已过期时,代理服务器将会直接连接原始服务器获取请求的内容,并转发给发起请求的用户。
在反向代理的配置中,可以通过 cache_peer 的 originserver 选项设置内容所在的原始服务器。
2) 上层代理服务器 (parent proxy)
可以将指定的代理服务器配置为当前代理服务器的上层,这样代理服务器将优先从上层服务器而不是原始内容服务器获取内容。有一些配置可以改变这个优先级,例如:never_direct 和 always_direct.
如果指定了 icp_port, 代理服务器可以使用 ICP 协议从上层代理服务器查询缓存对象。
3) 相邻代理服务器 (sibling proxy)
某些情况下,从相邻代理服务器上获取资源比上层服务器更有效率。这样可以使用 cache_peer 的 sibling 设置相邻代理服务器,代理服务器使用 HTTP 和 ICP 协议与相邻服务器通信,以获取未缓存在本地的内容对象。
[安装 Squid]
这个很多网络资料上都有,通常安装的目录是 /usr/local/squid,下面的操作路径都是指相对于 Squid 的安装路径。
[etc/squid.conf]
如果没有在 Squid 启动时用 -f file 指定其他的配置文件,Squid 默认从 etc/squid.conf 读取配置。
squid.conf 的格式每个配置一行,以 # 开头的行是注释。
通常在 squid.conf 中需要配置以下内容:
1) 基本 Squid 设置:
cache_mgr webmaster
缓存管理员的邮件地址,将显示在出错提示页面的联系方式中。
visible_hostname
设置 Squid 服务器的主机名,否则 Squid 试图查找服务器的主机名。
http_port
配置 Squid 绑定的 HTTP 端口和 IP 地址,默认配置是 http_port 3180.
host 可以是 IP 地址或者主机名,如果指定主机名,Squid 尝试获取主机名对应的 IP 地址。
如果没有指定 host, Squid 将绑定所有地址的端口;
配置选项: transparent - 支持透明代理,不能与 vhost / vport 同时设置
vhost - 内容加速器主机
vport - 内容加速器端口,通常与 http_port 相同,可以使用 vport= 设置其他端口
defaultsite= - 内容加速器的默认网址
icp_port
配置 Squid 绑定的 ICP 端口,ICP 端口用于 cache_peer 间的通讯。
设置 0 将不绑定 ICP 端口。
cache_peer
配置上层代理服务器 (及原始内容服务器) 和相邻代理服务器。Squid 通过指定的规则向原始内容服务器与其他代理服务器获取被请求的内容。
配置选项: host - 可以是主机名或 IP 地址,Squid 将解析配置的主机名。
[parent/sibling] - 设置服务器类型,上层代理服务器 (及原始内容服务器) 用 parent,相邻代理服务器用 sibling.
http_port - 用于指定服务器的 HTTP 端口。
icp_port - 用于指定服务器的 ICP 端口,如果没有请设置为 0.
[proxy-only] - 禁止本地缓存文件,仅作为请求代理。
[no-query] - 禁止向该服务器发送 ICP 请求。
[originserver] - 作为内容加速器的原始内容服务器。
[name=xxx] - 服务器的名称,如果同一台服务器的若干个端口存在不同代理,可以用 name=xxx 分别命名。
[round-robin] - 使用“轮换”机制在一组上层代理服务器间切换。
[weight=n] - 服务器的比重,n 必须为整数,默认的比重是 1.
mime_table /usr/local/squid/etc/mime.conf
配置 Squid 使用的 MIME 映射表。
hosts_file /etc/hosts
配置 Squid 使用的 hosts 文件。
cache_effective_user
用 root 用户启动 Squid 后,Squid 将改变它关联的 UID/GID 到上面设置的用户。
默认配置是 nobody.
cache_effective_group
Squid 将使用上面设置的组的 GID 替换启动后的 GID.
2) Squid 缓存设置
cache_mem
设置内存缓存区的大小,默认值是 cache_mem 8 MB. 值 bytes 包含单位 (MB/KB)。
cache_swap_low
cache_swap_high
设置缓存交换的下限与上限,在缓存利用率超过 cache_swap_low 后,Squid 将替换缓存对象;
当缓存利用率超过 cache_swap_high 后,Squid 将从缓存移除对象。
默认的设置是 cache_swap_low 90 与 cache_swap_high 95.
maximum_object_size
缓存的最大对象尺寸,超过 maximum_object_size 的对象不会在磁盘中缓存。
默认的设置是 maximum_object_size 4096 KB
minimum_object_size
磁盘中缓存的最小对象尺寸。默认的设置是 minimum_object_size 0 KB,这表示没有最小值。
maximum_object_size_in_memory
内存中缓存的最大对象尺寸。
cache_dir
配置 Squid 使用的缓存。可以配置多个 cache_dir 目录,使得 Squid 同时使用多个磁盘分区作为缓存空间。
Type 指定 Squid 使用的缓存存储系统类型:ufs,aufs,diskd,coss
ufs 是旧的常用 Squid 存储系统。它的配置格式为 cache_dir ufs Directory-Name Mbytes L1 L2 [options]
其中 Mbytes 设置存储系统的总磁盘空间,L1 设置缓存目录的第一级子目录数目,L2 是第二级子目录的数目。
aufs 与 ufs 使用相同的存储方式,但是通过 POSIX 线程避免 Squid 进程在磁盘 I/O 过程中阻塞。
diskd 同样与 ufs 使用相同的存储方式,但是通过分离的进程避免 Squid 进程在磁盘 I/O 过程中阻塞。
coss 使用由 Squid 实现的特殊存储系统作为缓存。
默认设置是 cache_dir ufs /usr/local/squid/var/cache 100 16 256
3) 控制 Squid 的访问
acl aclname
定义一个访问列表,能够定义的访问列表有以下类型 (常用的):
acl aclname src ip-address/netmask ... (客户端 IP 地址)
acl aclname src addr1-addr2/netmask ... (客户端 IP 地址范围)
acl aclname dst ip-address/netmask ... (URL 主机对应的 IP 地址)
acl aclname myip ip-address/netmask ... (本地主机 IP 地址)
acl aclname srcdomain .foo.com ... (客户端主机名,通过反向域名解析的客户端 IP 地址)
acl aclname dstdomain .foo.com ... (URL 中的目标主机名)
acl aclname srcdom_regex [-i] xxx ... (通过正则表达式匹配客户端主机名)
acl aclname dstdom_regex [-i] xxx ... (通过正则表达式匹配 URL 中的目标主机名)
acl aclname url_regex [-i] ^http:// ... (通过正则表达式匹配整个 URL)
acl aclname urlpath_regex [-i] \.gif$ ... (通过正则表达式匹配 URL 路径)
acl aclname port 80 70 21 ... (目的服务器的端口)
acl aclname port 0-1024 ... (目的服务器的端口范围)
acl aclname myport 3128 ... (本地主机的端口)
acl aclname proto HTTP FTP ... (使用的网络协议 Protocol)
acl aclname method GET POST ... (HTTP 请求的类型)
acl aclname browser [-i] regexp ... (匹配 HTTP 请求中的 User-Agent 内容)
acl aclname referer_regex [-i] regexp ... (匹配 HTTP 请求中的 Referer 内容,注意大部分请求不包含 Referer 内容)
acl aclname req_mime_type mime-type1 ... (请求的内容类型 MIME,注意它不匹配返回文件的 MIME 类型)
acl aclname rep_mime_type mime-type1 ... (返回的内容类型 MIME,注意不能在 http_access 中使用这类访问列表)
acl aclname req_header header-name [-i] any\.regex\.here (匹配 HTTP 请求的任意 Header 内容)
通常访问列表中的正则表达式是大小写敏感的,如果需要大小写不敏感,请使用 -i 选项。
常用的访问列表:
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl manager proto cache_object
http_access allow|deny [!]aclname ...
使用指定的访问列表允许或禁止 HTTP 访问。
如果没有设置 http_access 规则,默认规则是拒绝访问。
如果请求没有 http_access 规则与之匹配,则默认规则与最后一条 http_access 规则的 allow/deny 设置相反。
因此,最后的规则常设置为 http_access allow all 或者 http_access deny all.
header_access header_name allow|deny [!]aclname ...
使用指定的访问列表检查 HTTP 请求的头,并且根据内容允许或禁止 HTTP 访问。
cache_peer_domain cache-host [!]domain [domain ...]
限制被发送到指定的代理服务器的访问请求中包含的域名。
可以使用 cache_peer_domain 将针对不同域名的访问请求导向至各自的代理服务器或原始内容服务器。
例如: cache_peer_domain first_host first.domain
cache_peer_domain second_host second.domain
cache_peer_access cache-host allow|deny [!]aclname ...
类似 cache_peer_domain,但是使用访问列表控制对代理服务器的访问。
语法与 http_access 和其他访问设置类似。
refresh_pattern [-i] regex min percent max [options]
定义指定内容对象的刷新规则。默认情况下,正则表达式是大小写敏感的,使用 -i 选项可以使其大小写不敏感。
min 单位是分钟,未显式定义过期时间的内容对象使用 min 作为对象寿命的下限。
percent 百分比,未显式定义过期时间的内容对象使用 Last-Modified 时间的百分比作为对象的寿命。
max 单位是分钟,未显式定义过期时间的内容对象使用 min 作为对象寿命的上限。
推荐配置:
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
cache allow|deny [!]aclname ...
用于禁止特定的请求及响应不被 Squid 缓存,注意:用 cache 禁止缓存时,应该使用 deny.
默认的设置是 cache allow all. 推荐的设置如下:
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
no_cache allow|deny [!]aclname ...
与 cache 设置相同。
hierarchy_stoplist (keywords)
指定一份 URL 关键字列表,使得包含这些关键字的请求直接被发送到原始服务器。
注意:never_direct 将覆盖这一设置。
always_direct allow|deny [!]aclname ...
使用访问列表控制指定的请求被直接发送到原始服务器,而不经过任何其他代理服务器。
注意: 1) always_direct deny ... 不等于 never_direct allow ...
2) 该设置与 Squid 如何缓存请求的对象无关。
never_direct
与 always_direct 相反,该设置使用访问列表使得指定的请求从不直接发送到原始服务器。
4) Squid 日志设置
logformat
定义指定名称的日志格式,其中的格式请参考 squid.conf.default.
emulate_httpd_log on|off
设置 on 使得 Squid 模拟 Apache 的格式输出 access.log 日志。
access_log
在指定的路径输出 Squid 的访问日志。
可以使用访问列表控制记录的访问,如果没有设置访问列表,则记录所有访问。
设置 access_log none 可以禁止输出访问日志。
默认的设置是:
access_log /usr/local/squid/var/logs/access.log squid
cache_log /var/log/squid/cache.log
在指定的路径输出 Squid 的缓存日志,默认配置为:
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log
在指定的路径输出 Squid 的存储日志,默认配置为:
cache_store_log /usr/local/squid/var/logs/store.log
设置 cache_store_log none 可以禁止输出存储日志。
cache_swap_log
在指定的路径输出 Squid 的缓存交换日志,默认配置为:cache_swap_log none.
logfile_rotate 10
定义 Squid 轮换日志文件的数目,如果设置 10,则轮换的日志文件分别为 0 ~ 9。
设置 logfile_rotate 后,可以使用命令 'squid -k rotate' 轮换日志文件。
[sbin/squid]
这是 Squid 的主程序,通常运行 sbin/squid 就可以启动 squid 服务。
如果需要在重启后 Squid 自动运行,可以在 /etc/rc.d/rc.local 中添加:'/usr/local/squid/sbin/squid'.
sbin/squid 可以在命令行调用并携带系列参数,其中常用的有:
sbin/squid -z 创建 Squid 使用的缓存目录,在第一次运行 Squid 前必须执行。
如果需要重建 Squid 缓存,可以先使用 'rm -f /usr/local/squid/cache/*' 删除缓存,再使用 -z 重建。
sbin/squid -f file 使用指定的配置文件代替 /usr/local/squid/etc/squid.conf.
sbin/squid -k reconfigure 让 Squid 重新解析配置文件,在修改 squid.conf 后更新配置时使用。
sbin/squid -k rotate 让 Squid 轮换日志文件,建议用 crondb -e 定时执行这一命令,否则当 access.log 超出文件系统的最大尺寸后,Squid 将自动终止。
注意检查是否在 /etc/rc.d/rc.local 中添加了 '/sbin/service crond start' 使得 cron 自动运行。
sbin/squid -k shutdown|kill 结束或终止 Squid 服务,调用后 Squid 并不是立即终止,需要等待一些时间。
[bin/squidclient]
这是 Squid 自带的 HTTP 客户端,可以用来测试或者读取 Squid 统计信息。
常用的命令有:
/usr/local/squid/bin/squidclient -p
注意必须在 squid.conf 增加以下访问规则:http_access allow manager localhost,才能使用以上命令访问统计信息。否则请求将被 Squid 拒绝。
其中 -h
本文由 In355Hz 翻译整理, 转载请保留原作者, 谢谢