varnish 4.0 官方文檔翻譯16-Backend servers/M/B/D/H

Backend servers

varnish有"後端"或者"源"服務器的概念。backend server提供給varnish加速的內容。css

第一步設置是告訴varnish從哪兒找到backend server。使用你喜歡的編輯器打開varnishd引入的VCL文件。html

VCL文件的開頭有一小段有點像這樣:java

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

去掉註釋後正則表達式

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

這樣一段配置在varnish中定義了一個後端,被叫作default。(和c的函數定義有點類似),當varnish須要從後端得到內容時,它將鏈接127.0.0.1的8080端口。算法

varnish能夠定義多個後端,也能夠將幾個後端放在一個後端集羣裏面已達到負載均衡的目的。後端

Multiple backends

某些狀況下你可能須要讓varnish緩存多個後端的內容。你可能想讓varnish映射全部的url在單個後端上,或者是多個後端。這裏有些參數能夠知足這樣的需求。api

如今咱們須要在PHP站點中引入java應用。java應用的連接都是以/java/開頭的。 處理java應用的服務器監聽在8000端口上。默認的default.vcl文件這樣的:緩存

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

增長一個後端:服務器

backend java {
    .host = "127.0.0.1";
    .port = "8000";
}

如今須要告訴varnish將不一樣的url發送到不一樣的後端server。在vcl_recv中:app

sub vcl_recv {
    if (req.url ~ "^/java/") {
        set req.backend_hint = java;
    } else {
        set req.backend_hint = default;
    }
}

真的很簡單。停下來思考下。正如你所看到的,你能夠定義如何根據真實的任意數據來選擇後端。你想發送手機設備的請求到不一樣的後端?沒有問題。 能夠知足你的需求。

if (req.http.User-Agent ~ "(?i)MIDP|WAP|UP.Browser|Smartphone|Obigo|Mobile|AU.Browser|wxd.Mms|WxdB.Browser|CLDC|UP.Link|KM.Browser|UCWEB|SEMC\-Browser|Mini|Symbian|Palm|Nokia|Panasonic|MOT|SonyEricsson|NEC|Alcatel|Ericsson|BENQ|BenQ|Amoisonic|Amoi|Capitel|PHILIPS|SAMSUNG|Lenovo|Mitsu|Motorola|SHARP|WAPPER|LG|EG900|CECT|Compal|kejian|Bird|BIRD|G900/V1.0|Arima|CTL|TDG|Daxian|DAXIAN|DBTEL|Eastcom|EASTCOM|PANTECH|Dopod|Haier|HAIER|KONKA|KEJIAN|LENOVO|Soutec|SOUTEC|SAGEM|SEC|SED|EMOL|INNO55|ZTE|iPhone|Android|Windows CE|Wget|Java|Opera") {
    set req.backend_hint = mobile;
}

Backends and virtual hosts in Varnish

varnish徹底支持虛擬主機。他們歷來沒有明確宣佈這點是由於varnish以很是規的方式來實現這個功能。在vcl_recv咱們設置處理HTTP請求的路由。若是你想讓路由基於基本的虛擬主機作點什麼,你只須要檢查req.http.host即可。

sub vcl_recv {
    if (req.http.host ~ "foo.com") {
        set req.backend_hint = foo;
    } elsif (req.http.host ~ "bar.com") {
        set req.backend_hint = bar;
    }
}

~符號後面的理解爲正則表達式。這裏能夠匹配 "foo.com", "www.foo.com", "zoop.foo.com.cn" 還有其餘包含foo.com的域名。該實例是有意寫做如此,若是你明確了你的域名,你須要使用==來替代~符號。

sub vcl_recv {
    if (req.http.host == "foo.com" || req.http.host == "www.foo.com") {
        set req.backend_hint = foo;
    }
}

Directors

你也能夠將幾個後端組成一組後端。這個組被叫作Directors。能夠提升性能和彈性(增長一臺app,或者停用一臺app等等)。

你能夠定義幾個後端,而後將他們組織在一個Directors。這些操做須要你載入VMOD(varnish module),而後在vcl_init中調用這個VMOD。

import directors;    # load the directors

backend server1 {
    .host = "192.168.0.10";
}
backend server2 {
    .host = "192.168.0.10";
}

sub vcl_init {
    new bar = directors.round_robin();
    bar.add_backend(server1);
    bar.add_backend(server2);
}

sub vcl_recv {
    # send all traffic to the bar director:
    set req.backend_hint = bar.backend();
}

該調度器是round-robin調度器。這意味着Directors將以輪詢的算法來分發請求。還有一個random分配請求的director,你猜對了,隨機的方式。

可是若是其中的某個server宕機了呢?varnish能將全部的請求分發到健康的server麼?固然! Health Checks就是幹這事的!

Health checks

如今咱們給一個調度器設置兩個後端和健康檢測。先定義後端:

backend server1 {
    .host = "server1.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

backend server2 {
    .host = "server2.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

.probe是新的參數。在上面的例子中varnish將每5s檢測後端,超時設爲1s。每一個檢測將會發送get /的請求。若是5個檢測中大於3個是成功,varnish就認爲後端是健康的,反之,後端就有問題了。

更多.probe的信息能夠在varnish中查看Probes章節

咱們如今定義director

import directors;

sub vcl_init {
    new vdir = directors.round_robin();
    vdir.add_backend(server1);
    vdir.add_backend(server2);
}

你使用vir director做爲處理請求的後端,就像你使用一個簡單的後端那樣。Varnish不會將請求發送到標記爲不健康的後端上。

若是全部的後端都宕機了,varnish也能夠返回給用戶過時了的內容。查看Misbehaving servers得到更多如何開啓這個功能的信息。

請注意,varnish將保持健康運行的探針對全部加載VCLs。Varnish將探針合併成彷佛徹底一體的-所以若是你有不少載入的VCL,不要修改probe的配置,卸載VCL將禁用probes。更多信息請查看ref:reference-vcl-director.

相關文章
相關標籤/搜索