强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 存储类型对比

存储类型全称性能可靠性适用场景
ufsUnix File System★★★★★★★★默认,通用场景
aufsAsync Unix File System★★★★★★★★中等负载
diskdDisk Daemon★★★★★★★★高负载
rockRock Store★★★★★★★★★★高并发小对象
cossCyclic 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

参数说明

参数说明建议值
类型存储后端类型aufsrock
路径缓存数据目录独立分区/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)

策略全称特点
lruLeast Recently Used最近最少使用,默认策略
heap GDSFGreedy-Dual Size Frequency考虑大小和频率,命中率高
heap LFUDALFU 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/Rockcache_dir
内存管理对象缓存+索引+连接缓冲cache_mem
I/O 模型事件驱动+多路复用io_threads
辅助进程认证/ACL/URL重写auth_param
连接管理客户端+上游+对等体cache_peer
消息处理请求头/响应头操作request_header_*

注意:理解 Squid 的内部架构有助于做出合理的配置决策。例如,选择合适的存储后端需要了解不同引擎的 I/O 模型。

扩展阅读