Varnish

Varnish 🚀

又名:为什么你的破网站打开要 3 秒,别人只要 50ms?


一、Varnish 是个啥?🍦

Varnish(油漆/清漆)------ 名字取得很妙,它就是给 HTTP 请求"刷一层漆",让内容闪闪发光地返回给用户。

简单说:Varnish 是一个 HTTP 反向代理缓存加速器。它站在你 Web 服务器前面,像个暴躁前台一样拦截所有请求:

复制代码
客户端:我要 profile.html!
Varnish:这个我见过(已缓存),给!⚡ (不用惊动后端)
客户端:我要 /api/latest-data?t=123456
Varnish:这个每次都不一样,去吧皮卡丘,去找后端 ➡️

Varnish 的哲学:能不给后端的,绝对不给后端。后端是用来躺平的。


二、架构图(Mermaid 版)🎨

#mermaid-svg-v264E8OmUQL7YDf2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v264E8OmUQL7YDf2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v264E8OmUQL7YDf2 .error-icon{fill:#552222;}#mermaid-svg-v264E8OmUQL7YDf2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v264E8OmUQL7YDf2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v264E8OmUQL7YDf2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v264E8OmUQL7YDf2 .marker.cross{stroke:#333333;}#mermaid-svg-v264E8OmUQL7YDf2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v264E8OmUQL7YDf2 p{margin:0;}#mermaid-svg-v264E8OmUQL7YDf2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-v264E8OmUQL7YDf2 .cluster-label text{fill:#333;}#mermaid-svg-v264E8OmUQL7YDf2 .cluster-label span{color:#333;}#mermaid-svg-v264E8OmUQL7YDf2 .cluster-label span p{background-color:transparent;}#mermaid-svg-v264E8OmUQL7YDf2 .label text,#mermaid-svg-v264E8OmUQL7YDf2 span{fill:#333;color:#333;}#mermaid-svg-v264E8OmUQL7YDf2 .node rect,#mermaid-svg-v264E8OmUQL7YDf2 .node circle,#mermaid-svg-v264E8OmUQL7YDf2 .node ellipse,#mermaid-svg-v264E8OmUQL7YDf2 .node polygon,#mermaid-svg-v264E8OmUQL7YDf2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v264E8OmUQL7YDf2 .rough-node .label text,#mermaid-svg-v264E8OmUQL7YDf2 .node .label text,#mermaid-svg-v264E8OmUQL7YDf2 .image-shape .label,#mermaid-svg-v264E8OmUQL7YDf2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-v264E8OmUQL7YDf2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v264E8OmUQL7YDf2 .rough-node .label,#mermaid-svg-v264E8OmUQL7YDf2 .node .label,#mermaid-svg-v264E8OmUQL7YDf2 .image-shape .label,#mermaid-svg-v264E8OmUQL7YDf2 .icon-shape .label{text-align:center;}#mermaid-svg-v264E8OmUQL7YDf2 .node.clickable{cursor:pointer;}#mermaid-svg-v264E8OmUQL7YDf2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v264E8OmUQL7YDf2 .arrowheadPath{fill:#333333;}#mermaid-svg-v264E8OmUQL7YDf2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v264E8OmUQL7YDf2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v264E8OmUQL7YDf2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v264E8OmUQL7YDf2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v264E8OmUQL7YDf2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v264E8OmUQL7YDf2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v264E8OmUQL7YDf2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v264E8OmUQL7YDf2 .cluster text{fill:#333;}#mermaid-svg-v264E8OmUQL7YDf2 .cluster span{color:#333;}#mermaid-svg-v264E8OmUQL7YDf2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v264E8OmUQL7YDf2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v264E8OmUQL7YDf2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-v264E8OmUQL7YDf2 .icon-shape,#mermaid-svg-v264E8OmUQL7YDf2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v264E8OmUQL7YDf2 .icon-shape p,#mermaid-svg-v264E8OmUQL7YDf2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v264E8OmUQL7YDf2 .icon-shape .label rect,#mermaid-svg-v264E8OmUQL7YDf2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v264E8OmUQL7YDf2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v264E8OmUQL7YDf2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v264E8OmUQL7YDf2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 😴 后端服务器(常年打酱油)
⚡ Varnish Cache 集群(今天的主角)
⚖️ 负载均衡
🌍 地球村用户
Miss 💔 (没缓存)
Miss 💔
Miss 💔
Hit ❤️ (有缓存)
Hit ❤️
Hit ❤️
小明
小红
老王
HAProxy / Nginx LB
Varnish Node 1
Varnish Node 2
Varnish Node 3
Web Server 1
Web Server 2
Web Server 3

Varnish 内部工作流

#mermaid-svg-Mbzh0OBomLCjOfZ9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .error-icon{fill:#552222;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .marker.cross{stroke:#333333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 p{margin:0;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster-label text{fill:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster-label span{color:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster-label span p{background-color:transparent;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .label text,#mermaid-svg-Mbzh0OBomLCjOfZ9 span{fill:#333;color:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .node rect,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node circle,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node ellipse,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node polygon,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .rough-node .label text,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node .label text,#mermaid-svg-Mbzh0OBomLCjOfZ9 .image-shape .label,#mermaid-svg-Mbzh0OBomLCjOfZ9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .rough-node .label,#mermaid-svg-Mbzh0OBomLCjOfZ9 .node .label,#mermaid-svg-Mbzh0OBomLCjOfZ9 .image-shape .label,#mermaid-svg-Mbzh0OBomLCjOfZ9 .icon-shape .label{text-align:center;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .node.clickable{cursor:pointer;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .arrowheadPath{fill:#333333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Mbzh0OBomLCjOfZ9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mbzh0OBomLCjOfZ9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster text{fill:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .cluster span{color:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Mbzh0OBomLCjOfZ9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .icon-shape,#mermaid-svg-Mbzh0OBomLCjOfZ9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .icon-shape p,#mermaid-svg-Mbzh0OBomLCjOfZ9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .icon-shape .label rect,#mermaid-svg-Mbzh0OBomLCjOfZ9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mbzh0OBomLCjOfZ9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Mbzh0OBomLCjOfZ9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Mbzh0OBomLCjOfZ9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🏭 Varnish 进程
不要,滚 🖐️
让我康康
有!Hit ❤️
没有!Miss 💔
请求到达 :80
vcl_recv

收不收这请求?
直接拒绝/返回错误
vcl_hash

生成缓存 Key
查缓存

有木有?
vcl_hit

准备发货
vcl_deliver

打包返回
vcl_miss

去后端借
vcl_backend_fetch

请求后端
vcl_backend_response

后端返回了
塞进缓存 📦
用户拿到数据 🎉


三、Varnish 核心组件拆解 🛠️

组件 作用 一句话吐槽
VCL (Varnish Configuration Language) 领域专用语言,配置缓存策略 C 语言的壳,运维的命
Varnishd 主进程,管理一切 单线程事件驱动,Python 的 GIL 见了都直呼内行
Varnishlog 实时日志 不看不知道,一看全是 miss
Varnishstat 实时统计 运维装逼必备仪表盘
Varnishadm 管理控制台 热重载配置,不用重启,这就是排面
Varnishncsa NCSA 格式日志 给老板看的"你看 QPS 多高"报表

四、使用场景 🎯

1. 纯静态资源加速 ⭐⭐⭐⭐⭐

复制代码
图片、CSS、JS、视频片段 → 缓存 365 天
Varnish: "这玩意儿一万年不变,直接内存里待着吧"

2. 半静态页面缓存(新闻/博客/电商详情页)⭐⭐⭐⭐⭐

复制代码
文章详情页 → 缓存 5 分钟
谁看都一样,后端生成一次就行

3. API 结果缓存 ⭐⭐⭐⭐

复制代码
GET /api/hot-articles → 缓存 1 分钟
100 万用户同时刷新首页?后端:"我谢谢你 Varnish"

4. 移动端/App 接口加速 ⭐⭐⭐⭐

复制代码
CDN 只能到边缘节点,Varnish 帮你挡在应用服务器前

5. 作为 API 网关 ⭐⭐⭐

复制代码
请求路由、限流、鉴权、Header 改写...VCL 全搞定
缺点:写 VCL 比写 SQL 还让人秃头

6. 灰度发布/金丝雀 ⭐⭐⭐

复制代码
通过 VCL 按比例把流量切到新版本后端

❌ 不适用场景

  • 动态内容每次都变化(比如用户个人中心、实时竞价)→ 缓存了个寂寞
  • WebSocket 长连接 → Varnish 不会代理 WebSocket,别想了
  • 文件上传 → 这不是它的活

五、快速搭建 🏗️(Ubuntu/CentOS 通用)

5.1 安装 Varnish

bash 复制代码
# Ubuntu
apt update && apt install varnish -y

# CentOS
yum install epel-release -y
yum install varnish -y

5.2 配置后端

默认配置文件在 /etc/varnish/default.vcl,把你写的 VCL 覆盖进去:

vcl 复制代码
# /etc/varnish/default.vcl

vcl 4.1;

# 定义后端服务器(可以定义多个!)
backend default {
    .host = "127.0.0.1";   # 你后端 Web 的 IP
    .port = "8080";         # 你后端 Web 的端口
    .probe = {              # 健康检查
        .url = "/health";
        .interval  = 5s;
        .timeout   = 1s;
        .window    = 5;
        .threshold = 3;
    }
}

sub vcl_recv {
    # 只缓存 GET 和 HEAD
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);   # 不缓存,直接走
    }

    # 管理员路径不缓存
    if (req.url ~ "^/admin") {
        return (pass);
    }

    # 去除 Cookie 提升命中率(静态资源不需要 Cookie)
    if (req.url ~ "\.(css|js|png|gif|jpg|jpeg|svg|ico|woff2?)$") {
        unset req.http.Cookie;
    }

    return (hash);  # 走缓存逻辑
}

sub vcl_backend_response {
    # 静态资源缓存 30 天
    if (bereq.url ~ "\.(css|js|png|gif|jpg|jpeg|svg|ico|woff2?)$") {
        set beresp.ttl = 30d;
        unset beresp.http.Set-Cookie;
    }

    # API 缓存 1 分钟
    if (bereq.url ~ "^/api/") {
        set beresp.ttl = 1m;
    }

    # 默认缓存 5 分钟
    set beresp.ttl = 5m;

    return (deliver);
}

sub vcl_deliver {
    # 加个响应头方便调试:是命中还是未命中
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT 🤩";
    } else {
        set resp.http.X-Cache = "MISS 💀";
    }
}

5.3 启动 Varnish

bash 复制代码
# 修改监听端口(默认 6081,改成 80 前台见人)
vim /etc/varnish/varnish.params
# VARNISH_LISTEN_PORT=80

# 启动!
systemctl start varnish
systemctl enable varnish

5.4 验证效果

bash 复制代码
# 狂刷你的网站
curl -I http://your-domain.com/index.html

# 看响应头
# X-Cache: HIT 🤩   ← 这就对了!

5 分钟就能搭起来,剩下的时间是调 VCL 调到怀疑人生。


六、Varnish vs Nginx 终极对比 🥊

#mermaid-svg-twZ3Kp2XKdHHOp9k{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-twZ3Kp2XKdHHOp9k .error-icon{fill:#552222;}#mermaid-svg-twZ3Kp2XKdHHOp9k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-twZ3Kp2XKdHHOp9k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .marker.cross{stroke:#333333;}#mermaid-svg-twZ3Kp2XKdHHOp9k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-twZ3Kp2XKdHHOp9k p{margin:0;}#mermaid-svg-twZ3Kp2XKdHHOp9k .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster-label text{fill:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster-label span{color:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster-label span p{background-color:transparent;}#mermaid-svg-twZ3Kp2XKdHHOp9k .label text,#mermaid-svg-twZ3Kp2XKdHHOp9k span{fill:#333;color:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .node rect,#mermaid-svg-twZ3Kp2XKdHHOp9k .node circle,#mermaid-svg-twZ3Kp2XKdHHOp9k .node ellipse,#mermaid-svg-twZ3Kp2XKdHHOp9k .node polygon,#mermaid-svg-twZ3Kp2XKdHHOp9k .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .rough-node .label text,#mermaid-svg-twZ3Kp2XKdHHOp9k .node .label text,#mermaid-svg-twZ3Kp2XKdHHOp9k .image-shape .label,#mermaid-svg-twZ3Kp2XKdHHOp9k .icon-shape .label{text-anchor:middle;}#mermaid-svg-twZ3Kp2XKdHHOp9k .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .rough-node .label,#mermaid-svg-twZ3Kp2XKdHHOp9k .node .label,#mermaid-svg-twZ3Kp2XKdHHOp9k .image-shape .label,#mermaid-svg-twZ3Kp2XKdHHOp9k .icon-shape .label{text-align:center;}#mermaid-svg-twZ3Kp2XKdHHOp9k .node.clickable{cursor:pointer;}#mermaid-svg-twZ3Kp2XKdHHOp9k .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .arrowheadPath{fill:#333333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-twZ3Kp2XKdHHOp9k .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-twZ3Kp2XKdHHOp9k .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-twZ3Kp2XKdHHOp9k .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster text{fill:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k .cluster span{color:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-twZ3Kp2XKdHHOp9k .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-twZ3Kp2XKdHHOp9k rect.text{fill:none;stroke-width:0;}#mermaid-svg-twZ3Kp2XKdHHOp9k .icon-shape,#mermaid-svg-twZ3Kp2XKdHHOp9k .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-twZ3Kp2XKdHHOp9k .icon-shape p,#mermaid-svg-twZ3Kp2XKdHHOp9k .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-twZ3Kp2XKdHHOp9k .icon-shape .label rect,#mermaid-svg-twZ3Kp2XKdHHOp9k .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-twZ3Kp2XKdHHOp9k .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-twZ3Kp2XKdHHOp9k .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-twZ3Kp2XKdHHOp9k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🟢 Nginx
Web服务器 + 反向代理 + 缓存
配置语法
磁盘 + 内存
全能战士
缓存还行
🍦 Varnish
纯缓存代理
VCL 语言
基于内存
不能做 Web 服务器
缓存策略王者

对比维度 Varnish 🍦 Nginx 🟢
定位 纯 HTTP 缓存加速器 Web 服务器 + 反向代理 + 负载均衡 + 缓存...
哲学 "我一个请求都不想发给后端" "我能干这事顺便还能干那事"
缓存配置语言 VCL(图灵完备,能写逻辑) nginx.conf(指令式,按规则匹配)
缓存灵活性 ⭐⭐⭐⭐⭐ 想怎么玩怎么玩 ⭐⭐⭐ 静态文件指定时间
缓存旁路/降级 ★★★ Grace Mode 花式降级 ★★☆ proxy_cache_use_stale
压缩/解压 支持 Gzip/ESI 支持 Gzip
WebSocket ❌ 不支持 ✅ 支持
SSL 终止 ❌ 需搭配 Nginx/Hitch ✅ 原生支持
静态文件服务 ❌ 别想了 ✅ 这是老本行
负载均衡 ⭐⭐ 基础 ⭐⭐⭐⭐⭐ 多种算法
性能(纯缓存场景) 🚀 极快(专为缓存而造) 🚗 够用
国内生态 🌏 外企/大厂用得多 🌏🌏 国内绝对王者
学习曲线 😭 陡峭(VCL 地狱) 🙂 友好
社区/资料 📚 少但精 📚📚📚 泛滥

最佳实践:Varnish + Nginx 用爱发电组合 💑

#mermaid-svg-BJqEMJx9vEmvhLOz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BJqEMJx9vEmvhLOz .error-icon{fill:#552222;}#mermaid-svg-BJqEMJx9vEmvhLOz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BJqEMJx9vEmvhLOz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BJqEMJx9vEmvhLOz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BJqEMJx9vEmvhLOz .marker.cross{stroke:#333333;}#mermaid-svg-BJqEMJx9vEmvhLOz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BJqEMJx9vEmvhLOz p{margin:0;}#mermaid-svg-BJqEMJx9vEmvhLOz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster-label text{fill:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster-label span{color:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster-label span p{background-color:transparent;}#mermaid-svg-BJqEMJx9vEmvhLOz .label text,#mermaid-svg-BJqEMJx9vEmvhLOz span{fill:#333;color:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz .node rect,#mermaid-svg-BJqEMJx9vEmvhLOz .node circle,#mermaid-svg-BJqEMJx9vEmvhLOz .node ellipse,#mermaid-svg-BJqEMJx9vEmvhLOz .node polygon,#mermaid-svg-BJqEMJx9vEmvhLOz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BJqEMJx9vEmvhLOz .rough-node .label text,#mermaid-svg-BJqEMJx9vEmvhLOz .node .label text,#mermaid-svg-BJqEMJx9vEmvhLOz .image-shape .label,#mermaid-svg-BJqEMJx9vEmvhLOz .icon-shape .label{text-anchor:middle;}#mermaid-svg-BJqEMJx9vEmvhLOz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BJqEMJx9vEmvhLOz .rough-node .label,#mermaid-svg-BJqEMJx9vEmvhLOz .node .label,#mermaid-svg-BJqEMJx9vEmvhLOz .image-shape .label,#mermaid-svg-BJqEMJx9vEmvhLOz .icon-shape .label{text-align:center;}#mermaid-svg-BJqEMJx9vEmvhLOz .node.clickable{cursor:pointer;}#mermaid-svg-BJqEMJx9vEmvhLOz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BJqEMJx9vEmvhLOz .arrowheadPath{fill:#333333;}#mermaid-svg-BJqEMJx9vEmvhLOz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BJqEMJx9vEmvhLOz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BJqEMJx9vEmvhLOz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BJqEMJx9vEmvhLOz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BJqEMJx9vEmvhLOz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BJqEMJx9vEmvhLOz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster text{fill:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz .cluster span{color:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BJqEMJx9vEmvhLOz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BJqEMJx9vEmvhLOz rect.text{fill:none;stroke-width:0;}#mermaid-svg-BJqEMJx9vEmvhLOz .icon-shape,#mermaid-svg-BJqEMJx9vEmvhLOz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BJqEMJx9vEmvhLOz .icon-shape p,#mermaid-svg-BJqEMJx9vEmvhLOz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BJqEMJx9vEmvhLOz .icon-shape .label rect,#mermaid-svg-BJqEMJx9vEmvhLOz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BJqEMJx9vEmvhLOz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BJqEMJx9vEmvhLOz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BJqEMJx9vEmvhLOz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 动态请求
Miss 💔
静态文件
HTTPS 请求
Nginx

SSL终止 + 静态文件
Varnish

缓存加速
后端应用

Tomcat / Gunicorn / Node.js / PHP-FPM
直接返回

Nginx 在前面搞 SSL 和静态资源,Varnish 在中间搞动态缓存,后端在角落里养老。


七、可以搭建集群吗?🤝

当然可以!而且方案很多!

7.1 方案一:Hash 分片(最常用)

#mermaid-svg-a9xLbTwF07QaljSV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-a9xLbTwF07QaljSV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-a9xLbTwF07QaljSV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-a9xLbTwF07QaljSV .error-icon{fill:#552222;}#mermaid-svg-a9xLbTwF07QaljSV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a9xLbTwF07QaljSV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-a9xLbTwF07QaljSV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a9xLbTwF07QaljSV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a9xLbTwF07QaljSV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-a9xLbTwF07QaljSV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a9xLbTwF07QaljSV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a9xLbTwF07QaljSV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-a9xLbTwF07QaljSV .marker.cross{stroke:#333333;}#mermaid-svg-a9xLbTwF07QaljSV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a9xLbTwF07QaljSV p{margin:0;}#mermaid-svg-a9xLbTwF07QaljSV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-a9xLbTwF07QaljSV .cluster-label text{fill:#333;}#mermaid-svg-a9xLbTwF07QaljSV .cluster-label span{color:#333;}#mermaid-svg-a9xLbTwF07QaljSV .cluster-label span p{background-color:transparent;}#mermaid-svg-a9xLbTwF07QaljSV .label text,#mermaid-svg-a9xLbTwF07QaljSV span{fill:#333;color:#333;}#mermaid-svg-a9xLbTwF07QaljSV .node rect,#mermaid-svg-a9xLbTwF07QaljSV .node circle,#mermaid-svg-a9xLbTwF07QaljSV .node ellipse,#mermaid-svg-a9xLbTwF07QaljSV .node polygon,#mermaid-svg-a9xLbTwF07QaljSV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-a9xLbTwF07QaljSV .rough-node .label text,#mermaid-svg-a9xLbTwF07QaljSV .node .label text,#mermaid-svg-a9xLbTwF07QaljSV .image-shape .label,#mermaid-svg-a9xLbTwF07QaljSV .icon-shape .label{text-anchor:middle;}#mermaid-svg-a9xLbTwF07QaljSV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-a9xLbTwF07QaljSV .rough-node .label,#mermaid-svg-a9xLbTwF07QaljSV .node .label,#mermaid-svg-a9xLbTwF07QaljSV .image-shape .label,#mermaid-svg-a9xLbTwF07QaljSV .icon-shape .label{text-align:center;}#mermaid-svg-a9xLbTwF07QaljSV .node.clickable{cursor:pointer;}#mermaid-svg-a9xLbTwF07QaljSV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-a9xLbTwF07QaljSV .arrowheadPath{fill:#333333;}#mermaid-svg-a9xLbTwF07QaljSV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-a9xLbTwF07QaljSV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-a9xLbTwF07QaljSV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a9xLbTwF07QaljSV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-a9xLbTwF07QaljSV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a9xLbTwF07QaljSV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-a9xLbTwF07QaljSV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-a9xLbTwF07QaljSV .cluster text{fill:#333;}#mermaid-svg-a9xLbTwF07QaljSV .cluster span{color:#333;}#mermaid-svg-a9xLbTwF07QaljSV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-a9xLbTwF07QaljSV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-a9xLbTwF07QaljSV rect.text{fill:none;stroke-width:0;}#mermaid-svg-a9xLbTwF07QaljSV .icon-shape,#mermaid-svg-a9xLbTwF07QaljSV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a9xLbTwF07QaljSV .icon-shape p,#mermaid-svg-a9xLbTwF07QaljSV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-a9xLbTwF07QaljSV .icon-shape .label rect,#mermaid-svg-a9xLbTwF07QaljSV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a9xLbTwF07QaljSV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-a9xLbTwF07QaljSV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-a9xLbTwF07QaljSV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} hash(URL) → Node 1
hash(URL) → Node 2
hash(URL) → Node 3
HAProxy/Nginx 做负载均衡
Varnish 1
Varnish 2
Varnish 3
Backend
Backend
Backend

原理 :同一个 URL 永远落到同一台 Varnish 节点。

优点 :命中率高,简单粗暴

缺点:加节点 = 缓存全部重新分布(缓存雪崩 🔥)

7.2 方案二:主备 + 缓存复制
bash 复制代码
# 主 VCL 里把缓存变更推送给备用节点
# 这需要自己写脚本...或者直接用商业版 Varnish Enterprise
7.3 方案三:两层缓存架构

#mermaid-svg-pd7icLEwwgxI8yNy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pd7icLEwwgxI8yNy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pd7icLEwwgxI8yNy .error-icon{fill:#552222;}#mermaid-svg-pd7icLEwwgxI8yNy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pd7icLEwwgxI8yNy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pd7icLEwwgxI8yNy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pd7icLEwwgxI8yNy .marker.cross{stroke:#333333;}#mermaid-svg-pd7icLEwwgxI8yNy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pd7icLEwwgxI8yNy p{margin:0;}#mermaid-svg-pd7icLEwwgxI8yNy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pd7icLEwwgxI8yNy .cluster-label text{fill:#333;}#mermaid-svg-pd7icLEwwgxI8yNy .cluster-label span{color:#333;}#mermaid-svg-pd7icLEwwgxI8yNy .cluster-label span p{background-color:transparent;}#mermaid-svg-pd7icLEwwgxI8yNy .label text,#mermaid-svg-pd7icLEwwgxI8yNy span{fill:#333;color:#333;}#mermaid-svg-pd7icLEwwgxI8yNy .node rect,#mermaid-svg-pd7icLEwwgxI8yNy .node circle,#mermaid-svg-pd7icLEwwgxI8yNy .node ellipse,#mermaid-svg-pd7icLEwwgxI8yNy .node polygon,#mermaid-svg-pd7icLEwwgxI8yNy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pd7icLEwwgxI8yNy .rough-node .label text,#mermaid-svg-pd7icLEwwgxI8yNy .node .label text,#mermaid-svg-pd7icLEwwgxI8yNy .image-shape .label,#mermaid-svg-pd7icLEwwgxI8yNy .icon-shape .label{text-anchor:middle;}#mermaid-svg-pd7icLEwwgxI8yNy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pd7icLEwwgxI8yNy .rough-node .label,#mermaid-svg-pd7icLEwwgxI8yNy .node .label,#mermaid-svg-pd7icLEwwgxI8yNy .image-shape .label,#mermaid-svg-pd7icLEwwgxI8yNy .icon-shape .label{text-align:center;}#mermaid-svg-pd7icLEwwgxI8yNy .node.clickable{cursor:pointer;}#mermaid-svg-pd7icLEwwgxI8yNy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pd7icLEwwgxI8yNy .arrowheadPath{fill:#333333;}#mermaid-svg-pd7icLEwwgxI8yNy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pd7icLEwwgxI8yNy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pd7icLEwwgxI8yNy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pd7icLEwwgxI8yNy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pd7icLEwwgxI8yNy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pd7icLEwwgxI8yNy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pd7icLEwwgxI8yNy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pd7icLEwwgxI8yNy .cluster text{fill:#333;}#mermaid-svg-pd7icLEwwgxI8yNy .cluster span{color:#333;}#mermaid-svg-pd7icLEwwgxI8yNy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pd7icLEwwgxI8yNy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pd7icLEwwgxI8yNy rect.text{fill:none;stroke-width:0;}#mermaid-svg-pd7icLEwwgxI8yNy .icon-shape,#mermaid-svg-pd7icLEwwgxI8yNy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pd7icLEwwgxI8yNy .icon-shape p,#mermaid-svg-pd7icLEwwgxI8yNy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pd7icLEwwgxI8yNy .icon-shape .label rect,#mermaid-svg-pd7icLEwwgxI8yNy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pd7icLEwwgxI8yNy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pd7icLEwwgxI8yNy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pd7icLEwwgxI8yNy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Miss
Miss
🟢 L1: Varnish 第一层

(每台应用服务器上本地跑一个)
🔵 L2: Varnish 第二层

(集中式缓存集群)
Backend Server

L1 是本地快取(内存超快),L2 是共享大缓存。两层兜底,稳如老狗。

7.4 方案四:缓存预热脚本 + 独立节点

每台 Varnish 各自独立缓存,上线前用脚本预热把热门 URL 都塞进去。


八、优势 ✅

优势 解释
🚀 极致性能 纯 C 语言 + 内存缓存 + 工作区机制,单机轻松跑 10 万 QPS
🎛️ VCL 超灵活 图灵完备的 DSL,能写 if/else/正则/header修改/请求重写/合并... 你甚至能用 VCL 实现一个计算器(别试)
💊 Grace Mode 缓存过期了?别慌!先用旧数据顶着,后端好了再更新------用户体验:无感知
🌡️ 健康检查 后端挂了自动切换,搭配 Grace Mode 实现降级,稳如泰山
🔧 热重载 varnishadm vcl.load + vcl.use 不停机切换配置
📊 监控完善 命中率、请求数、后端状态...自带 varnishstat 仪表盘
🗑️ 缓存清理 支持 PURGEBAN,精确/批量清除缓存
🧩 ESI Edge Side Includes,页面碎片化缓存(比如导航栏全局缓存,正文按文章缓存)

九、劣势 ❌

劣势 吐槽
🔒 不支持 HTTPS 需要前面搭 Nginx 或 Hitch 来终结 SSL,架构多一层
📉 学习曲线陡峭 VCL 是另一门语言!语法像 C 但又不是 C,调试全靠 varnishlog 里猜谜
🌍 国内资料少 中文资料约等于 0,出问题只能啃英文文档和 Stack Overflow
💾 纯内存缓存 重启 = 缓存清空 = 后端瞬间爆炸 💥(可以用 persistent 存文件,但性能打折)
🚫 不支持 WebSocket 如果你的应用重度依赖 WebSocket,Varnish 直接滑走
📦 不能当 Web 服务器 它不返回静态文件,必须后面有个真实服务器
💰 商业版才有的功能 集群缓存复制、高级持久化等功能要花钱买 Varnish Enterprise
🐍 不代理 TCP/UDP 它是纯 HTTP 缓存,不像 Nginx 能代理四层流量

十、总结:什么时候用 Varnish?🤔

复制代码
你的网站后端 QPS 100,每天几万访问
    → Nginx 够了,别折腾 Varnish

你的网站 QPS 5000+,后端压力山大
    → 上 Varnish!缓存命中率 95%+ 不是梦

你的后端同时提供 Web + App + 开放 API,访问量巨大
    → Nginx(SSL+静态) + Varnish(动态缓存) 黄金搭档

你在国内中小厂
    → 用 Nginx 缓存就行了,招不到会 VCL 的人

你在外企/大厂/高并发场景
    → Varnish 是你的不二之选

最后一句大实话:Varnish 就像厨具里的分子料理枪------不到需要极致性能的时候你感受不到它的好,日常用 Nginx 就像一把万能菜刀,够用且顺手。但真到了每秒几万请求的场合,你会感谢那罐 "清漆" 的。


Written with ❤️ and VCL-induced headaches