返回介绍

最佳实践 10:配置和优化 Squid

发布于 2025-04-20 17:44:39 字数 3617 浏览 0 评论 0 收藏

Squid 是对 HTTP 协议遵从性最好的缓存软件,因此它在 CDN 中得到了大量的部署,是众多 CDN 公司使用到的核心缓存软件。在部署 Squid 时,建议遵从以下的规范。

推荐使用大内存服务器

对于热点文件,Squid 使用内存进行缓存,在 access_log 中体现为 TCP_MEM_HIT。因为使用了高速内存缓存机制,从而避免了从磁盘读入缓存内容,所以 TCP_MEM_HIT 是最高效的缓存方法。服务器所需要的内存,以能够完全容纳本站点的所有热点文件为标准。

推荐每个磁盘独立使用

对于过大的文件或者非经常访问的文件,Squid 使用基于磁盘的缓存。在创建磁盘缓存时,不需要将磁盘组配置成 RAID 10 或者 RAID 5、RAID 6,通过 cache_dir 配置直接使用每个独立磁盘进行缓存以提高磁盘 iops。配置指令如下:

cache_dir ufs /mnt/sdb1 8096 32 256
cache_dir ufs /mnt/sdc1 8096 32 256
cache_dir ufs /mnt/sdd1 8096 32 256
cache_dir ufs /mnt/sde1 8096 32 256

禁用 atime 更新

使用 noatime 选项来 mount 的文件系统,不会在读取磁盘缓存时更新相应的 inode 访问时间。在/etc/fstab 中的配置指令如下:

/dev/sdb1 /mnt/sdb1 ext3 noatime,nodiratime 0 0

配置 Squid 多实例

Squid 以单进程运行,对多 CPU 的架构支持不好,不能重复利用多 CPU 处理器代理的高性能。解决这个问题的思路是在部署 Squid 的服务器上,部署 Squid 多个实例进程。在部署多个实例时,需要注意每个 Squid 实例的以下配置项目必须不同:visible_hostname、unique_hostname、http_port、snmp_port、access_log、cache_log、pid_filename、cache_dir。

使用 URL 哈希方法对 Squid 多实例进行调度

参考图 2-2 所示的 CDN 节点的典型架构图,对 Squid 多实例进行负载均衡时,务必使用 URL 哈希方法。采用这个方法的好处如下。

- 增加缓存命中率。相同的 URL 访问到同一个 Squid 实例上,可以提高 Squid 缓存命中率。

- 避免 Squid 上缓存文件的重复。使用 URL 哈希后,不同的 Squid 上缓存不同的文件,因此可以大大节省 Squid 磁盘缓存空间和内存缓存空间。

禁用缓存间通信协议

缓存间通信协议的设计初衷是为了架构缓存集群,尽量减少对源站的访问。目前主要有以下缓存间通信协议和方法:ICP、HTCP、Cache Digest、WCCP、WCCP2。从实践来看,缓存间通信协议会导致缓存响应的延时,同时不利于问题的排查。因此,建议所有的 Squid 实例都单独提供缓存服务,不进行缓存间协议通信。禁用的方式是在编译时加入以下指令:

configure options:  '--prefix=/usr/local/squid' '--disable-icap-client' '--disable-wccp' '--disable-wccpv2' '--disable-htcp' '--disable-ident-lookups'  '--disable-auto-locale' --enable-ltdl-convenience

架构二级缓存

在实践中,往往会部署二级缓存节点以减少回源站的流量。一级缓存节点是指最边缘的缓存节点,是直接服务于终端用户的节点。二级缓存节点,在架构上实际上被一级缓存节点认为是源站,而不是缓存节点。一级缓存节点和二级缓存节点之间,并不使用缓存间通信协议,而是直接使用 HTTP 进行内容获取或者缓存内容验证。可以使用如下配置指令:

cache_peer 10.1.6.38 parent 80 0 no-query originserver round-robin no-digest no-netdb-exchange name=server_xufeng_info
acl sites_xufeng_info dstdomain .xufeng.info
cache_peer_access server_xufeng_info allow sites_xufeng_info

使用 Squid Manager 获取运行状态

Squid Manager 提供了对 Squid 运行进程状态的详细信息展示通道,在配置文件中使用如下指令配置后,即可使用该功能:

acl manager proto cache_object
cachemgr_passwd 6ByhK4fx config reconfigure shutdown
http_access allow manager localhost
http_access deny manager

主要使用的命令包括以下两类。

- 查看 Squid 运行状态的命令:

# /usr/local/squid/bin/squidclient -h 127.0.0.1 -p 80 mgr:info
主要关注以下的输出(命中率一般应该高于 80%):
Cache information for squid:
     Hits as % of all requests:     5min: 95.0%, 60min: 91.0% #请求命中率(按次数计算)
     Hits as % of bytes sent:     5min: 86.0%, 60min: 84.0% #请求命中率(按字节数计算)
     Memory hits as % of hit requests:     5min: 90.0%, 60min: 82.0% #内存缓存命中率

- 查看当前 Squid 运行的配置的命令:

# /usr/local/squid.bak/bin/squidclient -h 127.0.0.1 -p 80 -w 6ByhK4fx mgr:config #使用-w(小写)指定在 Squid 中配置的 Manager 密码

优化 HTTP Range

HTTP Range 方法提供了允许客户端只获取某个静态文件部分内容的能力。典型的 Range 请求的头部信息(部分)如下:

GET /test.rar HTTP/1.1
Connection: close
Host: file.xufeng.info
Range: bytes=1025-2048

这个请求的含义是:客户端希望读取获取 http://file.xufeng.info/test.rar 文件的从 1025 字节到 2048 字节的部分内容。这种请求方式在多线程下载器(如迅雷、Flashget)中比较常见,通过多个线程分别获取同一个 URL 的不同部分然后组合起来,可以提高下载速度。

在 Squid 中,以下指令用于控制对 HTTP Range 请求的缓存行为:

range_offset_limit

在实践中,建议配置为以下值以平衡 Range 请求和缓存整个文件之间效率问题:

range_offset_limit 3 MB

这样配置后,如果用户请求的起始 Range 字节在 3MB 以内,如 Squid 本地没有缓存过该文件,那么 Squid 会向后端请求整个文件,然后进行缓存。如果 Range 的起始范围超过 3MB,则 Squid 也使用 Range 向后端请求,此时文件不会被缓存。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。