[英]Varnish Cache, How do I route client traffic based on client source IP address?
@varnishcache 帮助? 如何根据客户端源 IP 地址路由客户端流量?
注意:我在两个不同的数据中心安装了两个清漆缓存服务器。
作为参考,我希望您查看https://www.varnish-software.com/developers/tutorials/multiple-backends/ 。 这是一个解释如何使用多个后端的教程。
如果您的目标是拥有“粘性 IP”策略,您可以使用一些 VCL 代码,如下例所示:
vcl 4.1;
import directors;
backend backend1 {
.host = "backend1.example.com";
.port = "80";
}
backend backend2 {
.host = "backend2.example.com";
.port = "80";
}
backend backend3 {
.host = "backend3.example.com";
.port = "80";
}
sub vcl_init {
new vdir = directors.hash();
vdir.add_backend(backend1);
vdir.add_backend(backend2);
vdir.add_backend(backend3);
}
sub vcl_recv {
set req.backend_hint = vdir.backend(client.ip);
}
在这种情况下,您将基于client.ip
值创建一个 hash,并根据该 hash 将流量路由到后端。IP 地址的每个请求都将在同一后端结束。
client.ip
值包含正确的值很重要。 如果您在 Varnish 前面运行 TLS 代理,则client.ip
值将始终是 TLS 代理之一,除非您利用PROXY 协议。
如果您不使用 PROXY 协议,您可能需要考虑使用req.http.X-Forwarded-For
作为 hash 的值,因为 header 将包含实际客户端的 IP 地址(以及可能的其他代理)之间)。
基于额外的评论和详细的需求规范,这里有一个新的 VCL 文件。
vcl 4.1;
import std;
probe health {
.url = "/";
.timeout = 2s;
.interval = 5s;
.window = 10;
.threshold = 5;
}
backend cdn1 {
.host = "cdn1.example.com";
.port = "80";
.probe = health;
}
backend cdn2 {
.host = "cdn2.example.com";
.port = "80";
.probe = health;
}
backend origin {
.host = "origin.example.com";
.port = "80";
.probe = health;
}
acl cdn2_acl {
"12.13.14/24";
}
sub vcl_recv {
set req.grace = 10s;
if(std.ip(req.http.X-Forwarded-For,"0.0.0.0") ~ cdn2_acl) {
set req.backend_hint = cdn2;
} elseif(std.healthy(cdn1)) {
set req.backend_hint = cdn1;
} else {
set req.backend_hint = origin;
set req.grace = 24h;
}
}
sub vcl_backend_response {
set beresp.grace = 24h;
}
此 VCL 文件的作用摘要:
X-Forwarded-For
header 的值与cdn2_acl
ACL 中定义的 IP 地址匹配,则将流量路由到cdn2
后端X-Forwarded-For
header 的值与 ACL 不匹配,尝试将流量路由到cdn1
后端cdn1
后端健康,则提供来自cdn1
的内容cdn1
后端不健康,直接连接到origin
后端并将宽限值提升到 24h;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.