[英]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.