簡體   English   中英

Varnish Cache,如何根據客戶端源 IP 地址路由客戶端流量?

[英]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 地址的每個請求都將在同一后端結束。

注意 TLS 終止

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;
  • 如果使用任何 CDN,請將寬限期減少到 10 秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM