varnish怎样配置HTTP缓存加速

联启 网络工具 13

本文目录导读:

varnish怎样配置HTTP缓存加速-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 安装 Varnish
  2. 配置 Varnish 监听端口和后端
  3. 核心缓存规则 (VCL)
  4. 缓存策略详解
  5. 常用优化技巧
  6. 常用维护命令
  7. 常见问题排查
  8. 生产环境最佳实践

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-Controlmax-age

生产环境最佳实践

  1. 先使用 varnishlog 调试,确认哪些请求被缓存或跳过
  2. 使用 purge,避免缓存过久导致数据不一致
  3. 结合 Nginx:通常架构是 用户 -> Varnish(80) -> Nginx(8080) -> PHP/Python
  4. 监控缓存命中率:70%+ 为良好,90%+ 为优秀
  5. 设置 grace 模式:在后端宕机时仍能提供过时缓存

标签: HTTP缓存加速

抱歉,评论功能暂时关闭!