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   │
               └─────────────┘

请求处理流程:

  1. 客户端发送HTTP请求到Varnish
  2. Varnish检查缓存中是否有有效响应
  3. 如果缓存命中(Hit),直接返回缓存内容
  4. 如果缓存未命中(Miss),转发请求到后端服务器
  5. 后端服务器返回响应
  6. 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消耗
- 高效内存利用

性能优势来源:

  1. 内存缓存:数据存储在内存中,访问速度极快
  2. 事件驱动:基于事件循环,高效处理并发
  3. 零拷贝:减少数据复制开销
  4. 高效存储:优化的内存分配和管理

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 问答社区

十、总结 #

本章我们学习了:

  1. Varnish定义:高性能HTTP加速器
  2. 工作原理:反向代理缓存机制
  3. 核心架构:进程模型和存储后端
  4. 核心特点:高性能、VCL、ESI、负载均衡
  5. 应用场景:网站加速、负载均衡、DDoS防护
  6. 版本选择:推荐使用7.x版本

了解Varnish的基本概念后,让我们进入下一章,学习如何安装Varnish!

最后更新:2026-03-28