- 前言
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第 1 篇 高性能网站构建
- 第 1 章 深入理解 DNS 原理与部署 BIND
- 第 2 章 全面解析 CDN 技术与实战
- 第 3 章 负载均衡和高可用技术
- 第 4 章 配置及调优 LVS
- 第 5 章 使用 HAProxy 实现 4 层和 7 层代理
- 第 6 章 实践 Nginx 的反向代理和负载均衡
- 第 7 章 部署商业负载均衡设备 NetScaler
- 第 8 章 配置高性能网站
- 第 9 章 优化 MySQL 数据库
- 第 2 篇 服务器安全和监控
- 第 10 章 构建企业级虚拟专用网络
- 第 11 章 实施 Linux 系统安全策略与入侵检测
- 第 12 章 实践 Zabbix 自定义模板技术
- 第 13 章 服务器硬件监控
- 第 3 篇 网络分析技术
- 第 14 章 使用 tcpdump 与 Wireshark 解决疑难问题
- 第 15 章 分析与解决运营商劫持问题
- 第 16 章 深度实践 iptables
- 第 4 篇 运维自动化和游戏运维
- 第 17 章 使用 Kickstart 完成批量系统安装
- 第 18 章 利用 Perl 编程实施高效运维
- 第 19 章 精通 Ansible 实现运维自动化
- 第 20 章 掌握端游运维的技术要点
- 第 21 章 精通手游运维的架构体系
最佳实践 10:配置和优化 Squid
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 向后端请求,此时文件不会被缓存。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论