03 - 架构深度解析
第三章:架构深度解析
3.1 Squid 整体架构
Squid 采用多进程/异步事件驱动混合架构,核心由以下组件协同工作:
┌──────────────────────────────────────────────────────┐
│ Squid 进程架构 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ 主进程 │ │ 网络 I/O │ │ 磁盘 I/O │ │
│ │ (squid主) │ │ Event Loop │ │ 异步线程 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 请求处理流水线 │ │
│ │ 接收 → ACL检查 → 认证 → 缓存查询 → 转发/响应 │ │
│ └──────────────────────────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 协议解析 │ │ 缓存存储 │ │ 辅助进程 │ │
│ │ (HTTP等) │ │ (Store) │ │ (helpers) │ │
│ └──────────┘ └──────────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────┘
3.2 请求处理流程
一个 HTTP 请求在 Squid 内部经历以下阶段:
客户端请求
│
▼
① 接收连接 (accept)
│
▼
② 协议解析 (HTTP Parser)
│
▼
③ ACL 检查 (http_access)
│
├── deny → 返回 403/407
│
▼
④ 认证检查 (如果配置了 auth)
│
├── 需要认证 → 返回 407
│
▼
⑤ 转发规则匹配 (never_direct / always_direct)
│
▼
⑥ 缓存查询 (Store Lookup)
│
├── HIT → ⑨ 缓存验证 → 返回缓存内容
│
├── MISS ↓
│
▼
⑦ 选择上游服务器 (peer selection)
│
├── 父代理 (parent peer)
├── 源站 (origin server)
└── 对等体 (sibling peer)
│
▼
⑧ 转发请求并接收响应
│
├── 缓存决策 → 存储到缓存
│
▼
⑨ 返回响应给客户端
3.3 缓存存储引擎 (Cache Storage)
Squid 支持多种存储后端,各有特点:
3.3.1 存储类型对比
| 存储类型 | 全称 | 性能 | 可靠性 | 适用场景 |
|---|---|---|---|---|
ufs | Unix File System | ★★★ | ★★★★★ | 默认,通用场景 |
aufs | Async Unix File System | ★★★★ | ★★★★ | 中等负载 |
diskd | Disk Daemon | ★★★★ | ★★★★ | 高负载 |
rock | Rock Store | ★★★★★ | ★★★★★ | 高并发小对象 |
coss | Cyclic Object Storage System | ★★★★★ | ★★★ | 已弃用 |
3.3.2 缓存目录配置
# UFS — 默认存储(同步 I/O)
cache_dir ufs /var/spool/squid 100 16 256
# AUFS — 异步 I/O(推荐中等负载)
cache_dir aufs /var/spool/squid 2000 16 256
# diskd — 独立磁盘守护进程
cache_dir diskd /var/spool/squid 5000 16 256 Q1=64 Q2=72
# Rock — 共享内存存储(适合小对象高并发)
cache_dir rock /var/spool/squid/rock 5120 max-size=32768
参数说明:
| 参数 | 说明 | 建议值 |
|---|---|---|
| 类型 | 存储后端类型 | aufs 或 rock |
| 路径 | 缓存数据目录 | 独立分区/SSD |
| 大小 (MB) | 缓存总容量 | 根据磁盘空间设定 |
| L1 目录数 | 一级子目录数量 | 16 或 64 |
| L2 目录数 | 二级子目录数量 | 256 |
| max-size | 单个对象最大字节数(仅 rock) | 32768 (32KB) |
3.3.3 缓存目录结构
/var/spool/squid/
├── 00/ # L1 目录(00-0F,共 16 个)
│ ├── 00/ # L2 目录(00-FF,共 256 个)
│ │ ├── 00000001 # 缓存对象文件
│ │ ├── 00000002
│ │ └── ...
│ ├── 01/
│ └── ...
├── 01/
├── ...
└── swap.state # 缓存索引文件(重建缓存目录时使用)
3.3.4 混合存储策略
可以在一个 Squid 实例中配置多种存储后端:
# 小对象使用 Rock 存储(SSD)
cache_dir rock /var/spool/squid/rock 10240 max-size=32768
# 大对象使用 AUFS 存储(HDD)
cache_dir aufs /var/spool/squid/large 100000 256 4096 min-size=32768
3.4 内存管理
3.4.1 内存缓存
# 内存缓存大小(建议物理内存的 25-50%)
cache_mem 512 MB
# 内存中存储对象的最大大小
maximum_object_size_in_memory 512 KB
# 内存替换策略
memory_replacement_policy lru
# 可选:lru(默认)、heap GDSF、heap LFUDA
3.4.2 内存使用组成
| 组成部分 | 说明 | 配置项 |
|---|---|---|
| 对象缓存 | 热点对象的内存副本 | cache_mem |
| 索引结构 | 缓存目录的内存索引 | 自动管理 |
| 连接缓冲 | 网络连接的读写缓冲 | read_ahead_gap |
| SSL 会话 | SSL/TLS 会话缓存 | ssl_session_cache |
| DNS 缓存 | DNS 查询结果缓存 | dns_nameservers |
| FQDN 缓存 | 主机名缓存 | 自动管理 |
3.4.3 替换策略 (Replacement Policy)
| 策略 | 全称 | 特点 |
|---|---|---|
lru | Least Recently Used | 最近最少使用,默认策略 |
heap GDSF | Greedy-Dual Size Frequency | 考虑大小和频率,命中率高 |
heap LFUDA | LFU with Dynamic Aging | 最不常用+动态老化 |
# 缓存替换策略(推荐 GDSF)
cache_replacement_policy heap GDSF
# 内存替换策略
memory_replacement_policy heap GDSF
3.5 协议处理
3.5.1 HTTP 协议支持
# HTTP 监听端口
http_port 3128
# 支持 HTTP/1.1 持久连接
# Squid 自动管理 keep-alive 连接
# 请求体最大大小(上传文件限制)
request_body_max_size 100 MB
# 请求头最大大小
request_header_max_size 64 KB
3.5.2 HTTPS 代理
# HTTPS 正向代理端口(CONNECT 方法)
# 客户端通过 HTTP CONNECT 隧道访问 HTTPS 站点
# 无需特殊配置,默认支持
# HTTPS 反向代理(SSL 卸载)
https_port 443 cert=/etc/squid/ssl/cert.pem key=/etc/squid/ssl/key.pem
3.5.3 FTP 代理
# FTP 代理(通过 HTTP 网关)
# Squid 自动将 ftp:// 请求转换为 FTP 协议
# FTP 用户
ftp_user anonymous@
ftp_passive on
3.5.4 WebSocket 支持
Squid 6.x 原生支持 WebSocket 协议升级:
# WebSocket 隧道通过 CONNECT 方法支持
# 无需额外配置,CONNECT 方法自动处理 ws:// 和 wss://
3.6 网络 I/O 模型
3.6.1 事件循环架构
Squid 使用 select() / poll() / epoll() 等 I/O 多路复用机制:
┌─────────────────────────────────┐
│ Event Loop │
│ │
│ ┌─────────┐ ┌─────────────┐ │
│ │ Timer │ │ Network │ │
│ │ Events │ │ Events │ │
│ └────┬────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────┐ │
│ │ I/O Multiplexer │ │
│ │ (epoll/kqueue/poll) │ │
│ └─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ Connection Handler │ │
│ │ accept/read/write/close│ │
│ └─────────────────────────┘ │
└─────────────────────────────────┘
3.6.2 I/O 线程配置
# I/O 线程数(默认由 Squid 自动决定)
# 建议值:CPU 核心数的 1-2 倍
# io_threads 16
# 原始 I/O 线程缓冲大小
# read_ahead_gap 16 KB
3.7 辅助进程 (Helpers)
Squid 通过辅助进程(Helper)扩展功能:
| Helper 类型 | 用途 | 配置项 |
|---|---|---|
| 认证 (Auth) | 用户身份验证 | auth_param basic program |
| 外部 ACL | 扩展访问控制 | external_acl_type |
| URL 重写 | 请求 URL 改写 | url_rewrite_program |
| DNS | 域名解析 | dns_nameservers |
| 日志 | 日志输出 | access_log daemon |
3.7.1 认证 Helper 示例
# Basic 认证 — 使用 NCSA 密码文件
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Proxy
auth_param basic credentialsttl 2 hours
# 定义认证 ACL
acl auth proxy_auth REQUIRED
# 要求认证
http_access allow auth
http_access deny all
3.7.2 URL 重写 Helper
# URL 重写程序
url_rewrite_program /usr/lib/squid/url_rewrite_helper
url_rewrite_children 10 startup=2 idle=1 concurrency=5
# 重写并发模式
url_rewrite_host_header on
url_rewrite_access allow all
3.7.3 Helper 进程管理
# Helper 进程数量和生命周期管理
auth_param basic children 5 startup=2 idle=3 concurrency=5
# Helper 超时
helper_startup_timeout 30 seconds
3.8 连接管理
3.8.1 客户端连接
# 客户端最大连接数
# 注:未设置则无限制
client_db on
# 客户端请求超时
client_lifetime 1 day
request_timeout 30 seconds
persistent_request_timeout 1 minute
# 客户端 IP 连接限制
acl maxconn maxconn 10
http_access deny maxconn
3.8.2 上游连接
# 连接到源站的超时
connect_timeout 1 minute
read_timeout 5 minutes
request_timeout 30 seconds
# 持久连接到源站
server_persistent_connections on
persistent_request_timeout 1 minute
3.8.3 对等体连接 (Cache Peers)
# 定义父代理
cache_peer parent.proxy.example.com parent 3128 3130 \
no-query default \
login=user:password
# 定义同级缓存
cache_peer sibling.proxy.example.com sibling 3128 3130 \
proxy-only
# 定义后端 Web 服务器(反向代理)
cache_peer web1.example.com parent 80 0 \
no-query originserver round-robin \
name=web1
cache_peer web2.example.com parent 80 0 \
no-query originserver round-robin \
name=web2
3.9 HTTP 消息处理
3.9.1 请求头处理
# 添加自定义请求头
request_header_add X-Forwarded-Proto https
# 删除请求头
request_header_access X-Custom-Header deny all
# 替换请求头
request_header_replace User-Agent "Mozilla/5.0 (compatible; Squid/6.0)"
3.9.2 响应头处理
# 添加 Via 头(标识代理链路)
via on
# 隐藏 Squid 版本信息
httpd_suppress_version_string on
# 删除响应头
reply_header_access Server deny all
reply_header_access X-Powered-By deny all
3.10 多实例部署
在高流量场景下,可以在一台机器上运行多个 Squid 实例:
# 实例 1 — 处理 HTTP
squid -f /etc/squid/squid-http.conf
# 实例 2 — 处理 HTTPS
squid -f /etc/squid/squid-https.conf
# 每个实例配置不同的端口和缓存目录
# squid-http.conf
# http_port 3128
# cache_dir ufs /var/spool/squid-http 5000 16 256
# squid-https.conf
# http_port 3129
# cache_dir ufs /var/spool/squid-https 5000 16 256
3.11 本章小结
| 组件 | 说明 | 关键配置 |
|---|---|---|
| 请求流水线 | 接收→ACL→认证→缓存→转发 | 按顺序配置各阶段 |
| 存储引擎 | UFS/AUFS/diskd/Rock | cache_dir |
| 内存管理 | 对象缓存+索引+连接缓冲 | cache_mem |
| I/O 模型 | 事件驱动+多路复用 | io_threads |
| 辅助进程 | 认证/ACL/URL重写 | auth_param 等 |
| 连接管理 | 客户端+上游+对等体 | cache_peer |
| 消息处理 | 请求头/响应头操作 | request_header_* |
注意:理解 Squid 的内部架构有助于做出合理的配置决策。例如,选择合适的存储后端需要了解不同引擎的 I/O 模型。