本文目录导读:

Varnish 是一款高性能的 HTTP 反向代理缓存服务器,主要用于加速 Web 内容交付,以下是一个完整的 Varnish 配置指南,涵盖基础安装、核心配置(VCL)和常用优化策略。
安装 Varnish
Ubuntu/Debian:
sudo apt update sudo apt install varnish -y
CentOS/RHEL:
sudo yum install epel-release -y sudo yum install varnish -y
配置 Varnish 监听端口和后端
编辑 Varnish 系统服务配置(通常位于 /etc/varnish/varnish.params 或 /etc/default/varnish):
VARNISH_LISTEN_PORT=80 # 监听端口(前端用户访问)
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
VARNISH_SECRET_FILE=/etc/varnish/secret
VARNISH_STORAGE="malloc,256M" # 缓存存储方式及大小
设置后端服务(编辑 /etc/varnish/default.vcl):
vcl 4.0;
# 定义后端服务器(你的 Web 服务器,如 Nginx/Apache)
backend default {
.host = "127.0.0.1";
.port = "8080"; # 确保 Web 服务器监听在 8080 端口
}
# 可定义多个后端
backend blog {
.host = "192.168.1.100";
.port = "80";
}
核心缓存规则 (VCL)
Varnish 使用 VCL (Varnish Configuration Language) 控制缓存行为,以下是一个典型的基本配置:
vcl 4.0;
import std;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
# 请求进入 Varnish 时
sub vcl_recv {
# 只缓存 GET 和 HEAD 请求
if (req.method != "GET" && req.method != "HEAD") {
return (pass); # 不缓存,直接转发到后端
}
# 不缓存带 Cookie 的请求(可自定义)
if (req.http.Cookie) {
return (hash); # 仍可缓存,但需在 vcl_backend_response 处理
}
# 不缓存某些路径
if (req.url ~ "^/admin" || req.url ~ "^/login") {
return (pass);
}
# 删除无关请求头,减少缓存多样性
unset req.http.Accept-Language;
unset req.http.User-Agent;
# 允许缓存
return (hash);
}
# 后端响应返回时
sub vcl_backend_response {
# 缓存状态码为 200, 301, 302, 404 的资源
if (beresp.status == 200 || beresp.status == 301 || beresp.status == 302 || beresp.status == 404) {
# 设置缓存时间(秒)
set beresp.ttl = 1h; # 1 小时
# 如果后端设置了 Cache-Control,可覆盖或保留
# 这里强制忽略后端设置的 Cache-Control
set beresp.http.Cache-Control = "public, max-age=3600";
}
# 排除带 Cookie 的响应(如果需要)
if (beresp.http.Set-Cookie) {
set beresp.ttl = 0s; # 不缓存
set beresp.uncacheable = true;
return (deliver);
}
# 启用 Stale-While-Revalidate(过时缓存可继续服务)
set beresp.stale_while_revalidate = 1d;
set beresp.stale_if_error = 3d;
return (deliver);
}
# 发送给客户端前
sub vcl_deliver {
# 添加调试头,显示是否命中缓存
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = "MISS";
}
}
缓存策略详解
| 规则 | 说明 |
|---|---|
| vcl_recv | 决定是否缓存,排除不需要缓存或无法缓存的请求 |
| vcl_backend_response | 决定哪些后端响应可以缓存,以及缓存时间 |
| vcl_deliver | 在返回客户端前,可添加调试头或修改响应 |
| vcl_hash | 控制缓存键,可增加 Cookie、URL 参数等作为键值 |
常用优化技巧
a) 强制缓存静态资源
sub vcl_backend_response {
if (req.url ~ "\.(png|gif|jpg|jpeg|svg|ico|css|js|woff2?)(\?.*)?$") {
set beresp.ttl = 30d; # 缓存 30 天
set beresp.http.Cache-Control = "public, max-age=2592000, immutable";
}
}
b) 清除缓存 (PURGE)
在 vcl_recv 中添加:
if (req.method == "PURGE") {
# 仅允许本地或特定 IP 进行 PURGE
if (client.ip != "127.0.0.1" && client.ip !~ /192\.168\./) {
return (synth(405, "Not allowed"));
}
return (purge);
}
然后使用命令清除缓存:
varnishadm ban req.url == "/path/to/content" # 或使用 HTTP PURGE 请求 curl -X PURGE http://yourdomain.com/path
c) 限制缓存大小和存储
编辑系统配置中的 VARNISH_STORAGE 参数:
VARNISH_STORAGE="malloc,512M" # 内存缓存 512MB
VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" # 文件缓存 1GB
d) 压缩内容
Varnish 默认不支持压缩,建议在后端(如 Nginx)启用压缩,或使用 Varnish 模块(如 libvmod-gzip)。
常用维护命令
# 重新加载配置文件(无需重启) varnishadm vcl.load new_config /etc/varnish/default.vcl varnishadm vcl.use new_config # 查看缓存状态 varnishstat # 查询当前缓存对象 varnishadm ban.list # 清除所有缓存 varnishadm ban "req.url ~ ." # 查看日志(实时) varnishlog -g request # 测试缓存命中 curl -I http://yourdomain.com # 查看响应头中的 X-Cache: HIT 或 MISS
常见问题排查
| 问题 | 解决 |
|---|---|
| 缓存未生效 | 检查 vcl_recv 是否 return (pass);检查 Cookie 或 Set-Cookie 是否干扰 |
| 所有请求都是 MISS | 确认后端 Cache-Control 是否被覆盖;检查 Varnish 缓存空间是否已满 |
| 缓存数据过期 | 调整 beresp.ttl 或后端响应中 Cache-Control 的 max-age |
生产环境最佳实践
- 先使用
varnishlog调试,确认哪些请求被缓存或跳过 - 使用
purge,避免缓存过久导致数据不一致 - 结合 Nginx:通常架构是
用户 -> Varnish(80) -> Nginx(8080) -> PHP/Python - 监控缓存命中率:70%+ 为良好,90%+ 为优秀
- 设置
grace模式:在后端宕机时仍能提供过时缓存
标签: HTTP缓存加速
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。