Varnish 配置模板

快速开始

想要快速的体验 Varnish ,可以直接使用雨云免费部署,使用带有我 AFF 的链接可以享受新用户 5 折优惠,后续也可享受其他优惠,优惠码wp-admin

通过雨云一键部署

Deploy on RainYun

一键部署默认提供一个简单的单后端配置文件

vcl 4.1;

backend default {
    .host = "127.0.0.1";  // 替换为你的Web服务器IP
    .port = "8080";       // 替换为你的Web服务器端口
}

sub vcl_recv {
    # 在这里添加请求处理逻辑
    return (hash);
}

sub vcl_backend_response {
    # 在这里添加后端响应处理逻辑
    set beresp.ttl = 10m;  # 设置缓存时间为10分钟
}

更多模板

多后端负载均衡

vcl 4.1;

import directors;

# 定义多个后端服务器
backend server1 {
    .host = "192.168.1.10";  # 第一个后端服务器IP
    .port = "8080";          # 端口
    .max_connections = 200;  # 最大连接数限制
}

backend server2 {
    .host = "192.168.1.11";  # 第二个后端服务器IP
    .port = "8080";
    .max_connections = 200;
}

backend server3 {
    .host = "192.168.1.12";  # 第三个后端服务器IP
    .port = "8080";
    .max_connections = 200;
}


# 负载均衡算法
sub vcl_init {
    new lb = directors.round_robin(); # 轮询算法
    # new lb = directors.random();  # 随机选择后端
    # new lb = directors.client_ip_hash();  # 基于客户端IP哈希

    lb.add_backend(server1);
    lb.add_backend(server2);
    lb.add_backend(server3);
}

sub vcl_recv {
    # 将请求发送到负载均衡器
    set req.backend_hint = lb.backend();
    return (hash);
}

sub vcl_backend_response {
    # 设置默认缓存时间为10分钟
    set beresp.ttl = 10m;
    
    # 可选:根据后端服务器设置不同的缓存标识
    set beresp.http.X-Backend-Server = bereq.backend.name;
}

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";
    }
}

IP 黑名单

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .max_connections = 200;
}

# 定义需要封锁的 IP 地址或 IP 段
acl blocked_ips {
    "192.168.1.100";       // 单个 IP 地址
    "10.0.0.0"/8;              // 整个 IP 段(CIDR 写法)
}

sub vcl_recv {
    # 检查客户端IP是否在封锁列表中
    if (client.ip ~ blocked_ips) {
        # 返回403 Forbidden错误
        return (synth(403, "Access denied: Your IP address is blocked"));
    }
    
    return (hash);
}

# 处理合成响应(如403错误)
sub vcl_synth {
    if (resp.status == 403) {
        # 可以自定义403页面内容
        set resp.http.Content-Type = "text/html; charset=utf-8";
        synthetic(
            {"<!DOCTYPE html>
            <html>
            <head>
                <title>Access Denied</title>
            </head>
            <body>
                <h1>403 - Access Denied</h1>
                <p>Your IP address has been blocked. If you believe this is an error, please contact support.</p>
            </body>
            </html>"}
        );
        return (deliver);
    }
}

sub vcl_backend_response {
    # 设置默认缓存时间为10分钟
    set beresp.ttl = 10m;
}

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";
    }
}

适用于 WordPress 的缓存规则

vcl 4.1;

# 定义WordPress后端服务器
backend wordpress {
    .host = "127.0.0.1";
    .port = "8080";
}

# WordPress专用缓存规则
sub vcl_recv {
    # 仅缓存GET和HEAD请求
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }

    # 不缓存管理员页面、登录页和API请求
    if (req.url ~ "^/wp-admin" || 
        req.url ~ "^/wp-login.php" || 
        req.url ~ "^/wp-json" ||
        req.url ~ "^/xmlrpc.php") {
        return (pass);
    }

    # 不缓存带查询参数的请求(除常见静态资源)
    if (req.url ~ "\?" && !(req.url ~ "\.(js|css|png|jpg|jpeg|gif|ico|svg)\?") ) {
        return (pass);
    }

    # 对静态资源设置较长缓存
    if (req.url ~ "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$") {
        set req.ttl = 30d;
    }

    # 正常缓存其他内容
    return (hash);
}

sub vcl_backend_response {
    # 从后端响应中移除不需要的缓存控制头
    unset beresp.http.Cache-Control;
    unset beresp.http.Expires;
    unset beresp.http.Pragma;
    unset beresp.http.Set-Cookie;

    # 静态资源缓存30天
    if (bereq.url ~ "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$") {
        set beresp.ttl = 30d;
        set beresp.http.Cache-Control = "public, max-age=2592000";
    } 
    # 其他内容缓存5分钟
    else {
        set beresp.ttl = 5m;
        set beresp.http.Cache-Control = "public, max-age=300";
    }

    # 允许缓存带Cookie的响应
    if (beresp.http.Set-Cookie) {
        set beresp.http.Set-Cookie = ";" + beresp.http.Set-Cookie;
        set beresp.http.Set-Cookie = regsuball(beresp.http.Set-Cookie, "; +", "; ");
        set beresp.http.Set-Cookie = regsuball(beresp.http.Set-Cookie, ";(wp-settings-[0-9a-z_]+|wp_test_cookie)=[^;]+", "; \1=; Max-Age=0");
        set beresp.http.Set-Cookie = regsuball(beresp.http.Set-Cookie, ";[^ ][^;]*", "");
        set beresp.http.Set-Cookie = regsuball(beresp.http.Set-Cookie, "^[; ]+|[; ]+$", "");
        
        if (beresp.http.Set-Cookie == "") {
            unset beresp.http.Set-Cookie;
        }
    }
}

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";
    }
}
1 个赞

好吧,明显有点累了

一晚上肝了一堆

1 个赞

难怪