Ubuntu24上使用Varnish做缓存
前奏
Redis 和 Varnish 一般在什么时候用,如下图所示
| 缓存方案 | 常见使用场景 | 优势 | 局限 |
|---|---|---|---|
| Redis | - 数据库查询结果缓存(减少数据库压力) - 会话(Session)存储 - 队列 / 发布订阅(Pub/Sub) - 排行榜、计数器 |
- 支持丰富数据结构 - 持久化可选(AOF/RDB) - 读写灵活,延迟低 |
- 占用内存 - 单线程(虽然可用多实例/Cluster扩展) |
| Varnish | - 静态网页、API 响应加速 - CDN 缓存前置(边缘缓存) - 对 HTTP 请求做快速响应 |
- 针对 HTTP 协议优化,速度快 - 可灵活设置缓存策略(VCL) |
- 只能缓存 HTTP 内容 - 不适合存储非 HTTP 数据结构 |
示例
安装并配置nginx
# 更新系统包索引
rambo@ubuntu24-2:~$ sudo apt update && sudo apt upgrade -y
# 安装必要工具
rambo@ubuntu24-2:~$ sudo apt install -y wget curl net-tools gnupg2 lsb-release apt-transport-https
# 安装Nginx
说明:Nginx 在此作为源站(backend),Varnish 会在前面做缓存加速
rambo@ubuntu24-2:~$ sudo apt install -y nginx
rambo@ubuntu24-2:~$ sudo systemctl restart nginx && sudo systemctl enable nginx
安装并配置Varnish
# Ubuntu 24 默认仓库已经有 Varnish 7.x
# 目录结构参考
/etc/varnish/default.vcl → 主配置文件(后端、缓存策略)
/var/www/html/ → Nginx 网站目录
/lib/systemd/system/varnish.service → Varnish 启动参数
rambo@ubuntu24-2:~$ sudo apt install -y varnish
rambo@ubuntu24-2:~$ sudo systemctl restart varnish && sudo systemctl enable varnish
# 配置 Varnish 监听端口
Varnish 默认监听 6081 端口,要让它监听80端口,把 Nginx 调整到其他端口(如8080)
# 修改Nginx端口为8080
rambo@ubuntu24-2:~$ sudo vim /etc/nginx/sites-available/default
server {
listen 8080 default_server;
listen [::]:8080 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
rambo@ubuntu24-2:~$ sudo systemctl restart nginx
# 修改Varnish监听端口
rambo@ubuntu24-2:~$ sudo vim /etc/systemd/system/multi-user.target.wants/varnish.service 或 /lib/systemd/system/varnish.service
找到 ExecStart= 行,
以下是原来的:
ExecStart=/usr/sbin/varnishd \
-j unix,user=vcache \
-F \
-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m # 支持的单位:m/M/G/GB/GiB
修改为:
ExecStart=/usr/sbin/varnishd \
-j unix,user=vcache \
-F \
-a :80 \ # 监听所有IP的80端口
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,2G # 表示使用2G内存缓存,可根据服务器内存大小调整
rambo@ubuntu24-2:~$ sudo systemctl daemon-reload && sudo systemctl restart varnish
==================================================================================================
参数释义:
-T localhost:6082 指的是启用 Varnish 管理接口(Management Interface),监听在 localhost 的 6082 端口
这个端口不是给普通 HTTP 请求用的,而是给 varnishadm 管理工具 连接用的
通过这个接口可以:
清理缓存(ban、purge)
查看后端状态
动态加载新的 VCL 配置
管理运行时参数
# 配合的参数
-S /etc/varnish/secret
这个文件存放一个共享密钥(secret key),varnishadm 连接 -T 接口时需要用这个密钥认证
只有通过认证的客户端才能执行管理操作,防止被恶意清缓存或改配置
# 修改共享密钥
rambo@ubuntu24-2:~$ sudo mv /etc/varnish/secret{,-bak}
1、生成新密钥
rambo@ubuntu24-2:~$ openssl rand -base64 32 | sudo tee /etc/varnish/secret
ZagjOytTYFOzrVucXW5fNfOYOutWAkSYgEe149MfkNI=
rambo@ubuntu24-2:~$ sudo chown root:root /etc/varnish/secret
rambo@ubuntu24-2:~$ sudo chmod 600 /etc/varnish/secret
2、重启Varnish服务让Varnish加载新的密钥
rambo@ubuntu24-2:~$ sudo systemctl restart varnish
3、连接 Varnish 管理接口
rambo@ubuntu24-2:~$ sudo varnishadm -T localhost:6082 -S /etc/varnish/secret
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,6.8.0-52-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit
varnish-7.1.1 revision 7cee1c581bead20e88d101ab3d72afb29f14d87a
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish>
# 在管理界面里执行清缓存
varnish> ban req.url ~ ".*"
200
varnish> quit
==================================================================================================
# 配置 Varnish Backend(default.vcl)
rambo@ubuntu24-2:~$ sudo vim /etc/varnish/default.vcl
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080"; # 确认后端指向Nginx新端口
}
sub vcl_recv {
# 处理特定请求,比如跳过缓存
if (req.url ~ "^/admin") {
return (pass);
}
}
sub vcl_backend_response {
# 缓存时间设置(例如HTML缓存5分钟)
if (beresp.ttl <= 0s) {
set beresp.ttl = 5m;
}
}
rambo@ubuntu24-2:~$ sudo systemctl restart varnish
# 验证 Varnish 工作
rambo@ubuntu24-2:~$ curl -I http://127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Wed, 13 Aug 2025 12:55:03 GMT
Content-Type: text/html
Last-Modified: Wed, 13 Aug 2025 12:48:35 GMT
ETag: W/"689c89a3-267"
Vary: Accept-Encoding
X-Varnish: 2
Age: 0
Via: 1.1 varnish (Varnish/7.1) # 如果看到响应头里有该项则说明Varnish已经在接管http请求
Accept-Ranges: bytes
Content-Length: 615
Connection: keep-alive
## 常用管理命令
# 查看 Varnish 状态
rambo@ubuntu24-2:~$ systemctl status varnish
# 查看缓存命中情况
rambo@ubuntu24-2:~$ varnishstat
# 清理缓存
rambo@ubuntu24-2:~$ varnishadm "ban req.url ~ ."
企业级都如何使用Varnish
在企业生产环境里,Varnish 很少是单机单节点这么简单,一般会结合 高可用、CDN、分布式部署 来用。常见模式:
① CDN 前置 + Varnish 源站加速
架构:用户 → CDN(全局缓存) → Varnish(源站缓存) → Web/应用服务器
优点:CDN 承担跨区域访问,Varnish 负责减少源站应用负载,双层缓存
场景:大型门户网站、电商平台、新闻站点
② Varnish 集群 + 负载均衡
架构:用户 → LVS/HAProxy/Nginx(反向代理+负载均衡) → 多台 Varnish 节点 → 应用服务器
优点:横向扩展,支持高并发,缓存一致性可通过 ban/purge 或软 TTL 策略处理
场景:高流量 API 服务、视频点播站
③ 专用的 Edge Caching(边缘缓存)
架构:Varnish 节点部署在靠近用户的边缘机房,减少回源延迟
优点:降低跨国/跨运营商延迟
场景:直播、游戏更新分发、跨国电商
企业里 Varnish 的配置特征:
VCL 精细化:按 URL/HTTP 头区分缓存策略(例如登录用户绕过缓存)
高可用:Keepalived + VRRP 做 IP 漂移,避免单点
监控:用 varnishstat、Prometheus varnish_exporter 监控命中率、延迟、内存
日志分析:varnishlog 或接入 ELK 做流量分析
安全:限制 varnishadm 端口访问,防止恶意清缓存
| 架构类型 | 特点 | 可行性(VMware 模拟) |
|---|---|---|
| CDN + 源站 Varnish | 用户请求经过 CDN 边缘缓存 → Varnish → 应用服务器 | 不适合完整 CDN,模拟只能用本地多 VM 模拟“边缘缓存 + 源站” |
| Varnish 集群 + LB | 多台 Varnish 节点 → 后端 Web 服务器,通过负载均衡分流 | 非常适合 VMware 模拟,完全可在虚拟机里搭建多节点 Varnish + Nginx + HAProxy/LVS |
| 边缘缓存部署 | Varnish 节点靠近用户节点分布 | 较难模拟真实地理分布,适合抽象展示 |
Varnish 集群 + LB + Web 服务器
高可用 + 高并发 + 缓存策略
| VM 名称 | 功能 | 系统推荐/主机名 | CPU/内存 | 网络 |
|---|---|---|---|---|
| lb | 负载均衡(HAProxy或Nginx) | Ubuntu24/111 | 1vCPU/1GB | NAT / 172.16.186.111/24 |
| varnish1 | Varnish 节点 1 | Ubuntu24/112 | 1vCPU/2GB | NAT / 172.16.186.112/24 |
| varnish2 | Varnish 节点 2 | Ubuntu24/113 | 1vCPU/2GB | NAT / 172.16.186.113/24 |
| web1 | Nginx 源站 1 | Ubuntu24/114 | 1vCPU/1GB | NAT / 172.16.186.114/24 |
| web2 | Nginx 源站 2 | Ubuntu24/115 | 1vCPU/1GB | NAT / 172.16.186.115/24 |
小拓扑:用户请求 → lb → [varnish1, varnish2] → [web1, web2]
# 步骤 1:搭建Web源站
安装 Nginx,准备简单 HTML 页面
rambo@114/5:~$
systemctl daemon-reload && sudo apt update && sudo apt install nginx -y
sudo systemctl restart nginx && sudo systemctl enable nginx
rambo@114:~$ sudo mv /var/www/html/index.nginx-debian.html{,-bak}
rambo@114:~$ echo "This is 114 Node!" | sudo tee /var/www/html/index.html
rambo@115:~$ sudo mv /var/www/html/index.nginx-debian.html{,-bak}
rambo@115:~$ echo "This is 115 Node!" | sudo tee /var/www/html/index.html
# 步骤 2:部署 Varnish 节点
rambo@112/3:~$ sudo apt update && sudo apt install varnish -y
修改 default.vcl 指向后端 Web 节点(可负载均衡 Nginx)
rambo@112/3:~$ sudo vim /etc/varnish/default.vcl
backend web114 { .host = "172.16.186.114"; .port = "80"; }
backend web115 { .host = "172.16.186.115"; .port = "80"; }
sub vcl_backend_response {
set beresp.ttl = 5m; # 缓存保存5分钟
}
# 客户端响应处理,隐藏Varnish Server头
sub vcl_deliver {
unset resp.http.Server;
set resp.http.Server = "MyCache";
}
# 内置错误响应处理,隐藏错误页中的Server头
sub vcl_synth {
unset resp.http.Server;
set resp.http.Server = "MyCache";
}
# 检查语法
rambo@111:~$ varnishd -C -f /etc/varnish/default.vcl
rambo@112/3:~$ sudo systemctl daemon-reload && sudo systemctl restart varnish && sudo systemctl enable varnish
rambo@112:~$ sudo netstat -anpt | grep 6081
tcp 0 0 0.0.0.0:6081 0.0.0.0:* LISTEN 13163/varnishd
tcp6 0 0 :::6081 :::* LISTEN 13163/varnishd
# 步骤 3:HAProxy负载均衡示例
rambo@111:~$ sudo apt install haproxy -y
rambo@111:~$ sudo vim /etc/haproxy/haproxy.cfg
....
....
# 新添加以下部分
frontend http_front
bind *:80
default_backend varnish_nodes
backend varnish_nodes
balance roundrobin
server varnish1 172.16.186.112:6081 check inter 2000 rise 2 fall 3
server varnish2 172.16.186.113:6081 check inter 2000 rise 2 fall 3
# 删除Varnish的Via头
http-response del-header Via
# 设置自定义Via头(可选)
http-response set-header Via "MyCache"
rambo@111:~$ sudo systemctl restart haproxy && sudo systemctl enable haproxy
rambo@111:~$ sudo netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 42542/haproxy
rambo@111:~$ curl http://172.16.186.111
This is 114 Node!
rambo@111:~$ curl http://172.16.186.111
This is 115 Node!
rambo@111:~$ curl http://172.16.186.111
This is 114 Node!
rambo@111:~$ curl http://172.16.186.111
This is 115 Node!
# 验证
rambo@111:~$ curl -I http://172.16.186.111
HTTP/1.1 200 OK
date: Wed, 13 Aug 2025 14:44:53 GMT
content-type: text/html
content-length: 18
last-modified: Wed, 13 Aug 2025 13:35:31 GMT
etag: "689c94a3-12"
x-varnish: 7 32773
age: 21
via: 1.1 varnish (Varnish/7.1) # 没在haproxy.cfg中添加最后2项删除Varnish的Via头时
accept-ranges: bytes
server: MyCache
rambo@111:~$ curl -I http://172.16.186.111
HTTP/1.1 200 OK
date: Wed, 13 Aug 2025 14:52:48 GMT
content-type: text/html
content-length: 18
last-modified: Wed, 13 Aug 2025 13:35:31 GMT
etag: "689c94a3-12"
x-varnish: 2
age: 0
accept-ranges: bytes
server: MyCache
via: MyCache # 在haproxy.cfg中添加最后2项删除Varnish的Via头时
其他服务或本服务如需帮助,请看 这里
.
.
.
.
.

浙公网安备 33010602011771号