Varnish简介 #
一、什么是Varnish #
Varnish Cache 是一款高性能的开源 HTTP 加速器,也被称为 HTTP 反向代理缓存或 Web 应用加速器。它位于 Web 服务器前端,通过缓存 HTTP 响应来加速网站访问速度。
1.1 核心定义 #
| 概念 | 说明 |
|---|---|
| HTTP加速器 | 加速HTTP请求响应的代理服务器 |
| 反向代理 | 代表后端服务器接收客户端请求 |
| 缓存服务器 | 存储HTTP响应,减少后端负载 |
| Web加速器 | 提升网站性能和用户体验 |
1.2 工作原理 #
text
┌─────────┐ ┌─────────────┐ ┌─────────────┐
│ Client │────▶│ Varnish │────▶│ Backend │
│ │◀────│ (Cache) │◀────│ Server │
└─────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ Cache │
│ Storage │
└─────────────┘
请求处理流程:
- 客户端发送HTTP请求到Varnish
- Varnish检查缓存中是否有有效响应
- 如果缓存命中(Hit),直接返回缓存内容
- 如果缓存未命中(Miss),转发请求到后端服务器
- 后端服务器返回响应
- Varnish缓存响应并返回给客户端
二、发展历史 #
2.1 项目起源 #
| 时间 | 事件 |
|---|---|
| 2006年 | Varnish项目启动,由挪威在线报纸Verdens Gang发起 |
| 2006年 | 首个公开版本发布 |
| 2010年 | Varnish 2.0发布,引入VCL语言 |
| 2013年 | Varnish 3.0发布,增强ESI支持 |
| 2015年 | Varnish 4.0发布,改进流媒体支持 |
| 2018年 | Varnish 6.0发布,支持HTTP/2 |
| 2021年 | Varnish 7.0发布,性能大幅提升 |
2.2 设计理念 #
Varnish的设计理念源于对高性能Web加速的需求:
- 内存优先:充分利用现代服务器大内存优势
- 灵活配置:通过VCL语言实现高度可定制
- 简单可靠:专注于缓存加速,做好一件事
- 性能至上:从架构设计上追求极致性能
三、核心架构 #
3.1 架构组件 #
text
┌────────────────────────────────────────────────────┐
│ Varnish 架构 │
├────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Manager │ │ CLI │ │ VCL │ │
│ │ Process │ │ Interface│ │ Compiler│ │
│ └──────────┘ └──────────┘ └──────────┘ │
├────────────────────────────────────────────────────┤
│ Worker Process │
│ ┌──────────────────────────────────────────────┐ │
│ │ Request Processing │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ vcl_recv│ │vcl_hash│ │vcl_hit │ │vcl_miss│ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ └──────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────┐ │
│ │ Storage Backend │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ malloc │ │ file │ │ jemalloc│ │ │
│ │ └────────┘ └────────┘ └────────┘ │ │
│ └──────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────┘
3.2 核心进程 #
| 进程 | 说明 |
|---|---|
| varnishd | 主守护进程 |
| varnishd-worker | 工作进程,处理请求 |
| varnishd-manager | 管理进程,处理CLI命令 |
| varnishlog | 日志记录进程 |
3.3 存储后端 #
| 存储类型 | 说明 | 适用场景 |
|---|---|---|
| malloc | 内存存储 | 小型缓存、测试环境 |
| file | 文件映射存储 | 大型缓存、生产环境 |
| jemalloc | 高效内存分配器 | 高性能场景 |
四、核心特点 #
4.1 高性能 #
bash
# 性能特点
- 单机可达 10万+ QPS
- 毫秒级响应延迟
- 低CPU消耗
- 高效内存利用
性能优势来源:
- 内存缓存:数据存储在内存中,访问速度极快
- 事件驱动:基于事件循环,高效处理并发
- 零拷贝:减少数据复制开销
- 高效存储:优化的内存分配和管理
4.2 VCL配置语言 #
Varnish Configuration Language (VCL) 是Varnish的核心配置语言:
vcl
vcl 4.1;
# 定义后端服务器
backend default {
.host = "127.0.0.1";
.port = "8080";
}
# 请求处理
sub vcl_recv {
# 移除Cookie以缓存静态资源
if (req.url ~ "\.(css|js|png|gif|jpg)$") {
unset req.http.Cookie;
}
}
# 缓存命中处理
sub vcl_hit {
return (deliver);
}
# 缓存未命中处理
sub vcl_miss {
return (fetch);
}
4.3 ESI支持 #
Edge Side Includes (ESI) 允许页面片段级别的缓存:
html
<html>
<body>
<esi:include src="/header"/>
<div>动态内容</div>
<esi:include src="/footer"/>
</body>
</html>
4.4 负载均衡 #
内置多种负载均衡算法:
vcl
backend server1 { .host = "192.168.1.1"; .port = "8080"; }
backend server2 { .host = "192.168.1.2"; .port = "8080"; }
backend server3 { .host = "192.168.1.3"; .port = "8080"; }
sub vcl_init {
new cluster = directors.round_robin();
cluster.add_backend(server1);
cluster.add_backend(server2);
cluster.add_backend(server3);
}
sub vcl_recv {
set req.backend_hint = cluster.backend();
}
五、应用场景 #
5.1 网站加速 #
| 场景 | 配置要点 |
|---|---|
| 静态资源缓存 | 缓存CSS、JS、图片等静态文件 |
| 动态页面缓存 | 缓存生成成本高的动态页面 |
| API响应缓存 | 缓存API响应,减轻后端压力 |
5.2 负载均衡 #
vcl
import directors;
backend web1 { .host = "10.0.0.1"; .port = "80"; }
backend web2 { .host = "10.0.0.2"; .port = "80"; }
backend web3 { .host = "10.0.0.3"; .port = "80"; }
sub vcl_init {
new balancer = directors.round_robin();
balancer.add_backend(web1);
balancer.add_backend(web2);
balancer.add_backend(web3);
}
5.3 DDoS防护 #
vcl
sub vcl_recv {
# 限制请求频率
if (req.http.Cookie ~ "rate_limit=1") {
return (synth(429, "Too Many Requests"));
}
# IP黑名单
if (client.ip ~ blacklist) {
return (synth(403, "Forbidden"));
}
}
5.4 A/B测试 #
vcl
sub vcl_recv {
# 基于Cookie分流
if (req.http.Cookie ~ "variant=b") {
set req.backend_hint = variant_b;
} else {
set req.backend_hint = variant_a;
}
}
六、Varnish vs 其他方案 #
6.1 与Nginx缓存对比 #
| 特性 | Varnish | Nginx |
|---|---|---|
| 缓存能力 | 专业级 | 基础级 |
| 配置灵活性 | VCL语言 | 配置指令 |
| ESI支持 | 原生支持 | 不支持 |
| 性能 | 极高 | 高 |
| 学习曲线 | 较陡 | 平缓 |
| 功能范围 | 缓存专用 | 全功能Web服务器 |
6.2 与Squid对比 #
| 特性 | Varnish | Squid |
|---|---|---|
| 设计目标 | Web加速 | 代理缓存 |
| 性能 | 更高 | 较高 |
| 配置方式 | VCL | 配置文件 |
| 内存管理 | 更优 | 一般 |
| 应用场景 | 反向代理 | 正向/反向代理 |
6.3 选择建议 #
| 场景 | 推荐方案 |
|---|---|
| 纯缓存加速 | Varnish |
| Web服务器+缓存 | Nginx |
| 企业代理服务器 | Squid |
| 复杂Web应用 | Nginx + Varnish |
七、典型部署架构 #
7.1 单机部署 #
text
┌─────────────────────────────────────┐
│ Single Server │
│ ┌─────────┐ ┌─────────────┐ │
│ │ Varnish │──────▶│ Backend │ │
│ │ :80 │ │ :8080 │ │
│ └─────────┘ └─────────────┘ │
└─────────────────────────────────────┘
7.2 高可用部署 #
text
┌─────────────┐
│ LB/HA │
└──────┬──────┘
┌────────────┼────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│Varnish 1│ │Varnish 2│ │Varnish 3│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└────────────┼────────────┘
▼
┌───────────────────────┐
│ Backend Cluster │
│ ┌───┐ ┌───┐ ┌───┐ │
│ │W1 │ │W2 │ │W3 │ │
│ └───┘ └───┘ └───┘ │
└───────────────────────┘
八、版本演进 #
8.1 主要版本特性 #
| 版本 | 发布时间 | 主要特性 |
|---|---|---|
| 4.x | 2014 | 改进流媒体、VCL 4.0 |
| 5.x | 2016 | HTTP/2支持、动态后端 |
| 6.x | 2018 | HTTP/2完善、VMOD扩展 |
| 7.x | 2021 | 性能优化、新VMOD接口 |
8.2 版本选择建议 #
bash
# 查看当前版本
varnishd -V
# 推荐使用
- 生产环境:Varnish 7.x (LTS)
- 开发环境:Varnish 7.x
- 遗留系统:Varnish 6.x
九、学习资源 #
9.1 官方资源 #
| 资源 | 地址 |
|---|---|
| 官方网站 | https://varnish-cache.org/ |
| 官方文档 | https://varnish-cache.org/docs/ |
| VMOD仓库 | https://github.com/varnish/varnish-modules |
9.2 社区资源 #
| 资源 | 说明 |
|---|---|
| Varnish邮件列表 | 社区讨论和技术支持 |
| GitHub Issues | 问题反馈和功能请求 |
| Stack Overflow | 问答社区 |
十、总结 #
本章我们学习了:
- Varnish定义:高性能HTTP加速器
- 工作原理:反向代理缓存机制
- 核心架构:进程模型和存储后端
- 核心特点:高性能、VCL、ESI、负载均衡
- 应用场景:网站加速、负载均衡、DDoS防护
- 版本选择:推荐使用7.x版本
了解Varnish的基本概念后,让我们进入下一章,学习如何安装Varnish!
最后更新:2026-03-28