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头时


其他服务或本服务如需帮助,请看 这里
.
.
.
.
.

posted @ 2025-08-14 09:23  Linux大魔王  阅读(32)  评论(0)    收藏  举报