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 仪表盘 |
| 🗑️ 缓存清理 | 支持 PURGE 和 BAN,精确/批量清除缓存 |
| 🧩 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