Varnish HTTP 缓存加速教程
Varnish Cache 是一款高性能的 HTTP 反向代理缓存服务器,通过将 Web 内容缓存在内存中来大幅提升网站响应速度。它使用自定义的 VCL(Varnish Configuration Language)语言来定义灵活的缓存策略。在搬瓦工 VPS 上部署 Varnish 可以将网站性能提升数倍至数十倍。
一、安装 Varnish
# Ubuntu/Debian
apt update
apt install varnish -y
# 安装最新版本(官方仓库)
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish75/script.deb.sh | bash
apt install varnish -y
# CentOS
yum install varnish -y
# 验证安装
varnishd -V
二、基础配置
2.1 修改监听端口
# 编辑 Varnish 服务配置
# Ubuntu 22.04
nano /etc/default/varnish
# 修改监听端口为 80
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"
# 同时修改 systemd 服务文件
systemctl edit --full varnish
# 找到 ExecStart 行,修改端口为 80
2.2 修改后端服务器
将 Nginx 改为监听 8080 端口,Varnish 监听 80 端口:
# 修改 Nginx 监听端口为 8080
# 编辑 /etc/nginx/sites-available/default
# 将 listen 80 改为 listen 8080
三、VCL 配置
cat > /etc/varnish/default.vcl <<'EOF'
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 5s;
.first_byte_timeout = 60s;
.between_bytes_timeout = 10s;
}
sub vcl_recv {
# 移除不影响缓存的 Cookie
if (req.url ~ "\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$") {
unset req.http.Cookie;
return (hash);
}
# 不缓存带认证的请求
if (req.http.Authorization) {
return (pass);
}
# 不缓存 POST 请求
if (req.method == "POST") {
return (pass);
}
# 不缓存管理后台
if (req.url ~ "^/admin" || req.url ~ "^/wp-admin") {
return (pass);
}
# 规范化 Accept-Encoding
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
unset req.http.Accept-Encoding;
}
}
return (hash);
}
sub vcl_backend_response {
# 静态资源缓存 7 天
if (bereq.url ~ "\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$") {
set beresp.ttl = 7d;
unset beresp.http.Set-Cookie;
}
# HTML 页面缓存 1 小时
if (beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 1h;
}
# 不缓存错误响应
if (beresp.status >= 400) {
set beresp.ttl = 0s;
set beresp.uncacheable = true;
}
# 启用 Grace 模式(后端故障时提供过期缓存)
set beresp.grace = 6h;
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";
}
# 移除 Varnish 标识头(安全考虑)
unset resp.http.X-Varnish;
unset resp.http.Via;
}
EOF
四、启动与验证
# 检查 VCL 配置语法
varnishd -C -f /etc/varnish/default.vcl
# 启动 Varnish
systemctl start varnish
systemctl enable varnish
# 验证缓存是否工作
curl -I http://localhost/
# 查看 X-Cache 响应头:HIT 表示命中缓存,MISS 表示未命中
五、缓存管理
# 清除所有缓存
varnishadm "ban req.url ~ ."
# 清除特定 URL 的缓存
varnishadm "ban req.url == /index.html"
# 清除特定路径下的缓存
varnishadm "ban req.url ~ ^/blog/"
# 使用 PURGE 方法清除(需要 VCL 配置支持)
curl -X PURGE http://localhost/page-to-purge
六、性能监控
# 实时统计面板
varnishstat
# 实时请求日志
varnishlog
# 查看命中率
varnishstat -f MAIN.cache_hit -f MAIN.cache_miss
# Top 请求统计
varnishtop -i ReqURL
# 生成历史统计
varnishhist
七、性能调优
# 调整缓存大小(在 /etc/default/varnish 中)
# 256MB 适合 1GB 内存的 VPS
-s malloc,256m
# 512MB 适合 2GB 内存的 VPS
-s malloc,512m
# 使用文件存储(大缓存场景)
-s file,/var/lib/varnish/storage.bin,2G
# 调整线程参数
-p thread_pool_min=50
-p thread_pool_max=1000
-p thread_pool_timeout=120
八、健康检查
# 在 VCL 中配置后端健康检查
cat >> /etc/varnish/default.vcl <<'EOF'
backend default {
.host = "127.0.0.1";
.port = "8080";
.probe = {
.url = "/health";
.timeout = 2s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
EOF
# 查看后端健康状态
varnishadm backend.list
总结
Varnish 是提升网站性能最有效的方案之一,特别适合内容变化不频繁的网站。配合 Brotli 压缩 和 HTTP/2 升级 可以进一步优化 Web 性能。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。