天天看點

varnish學習筆記-後端伺服器varnish學習筆記-後端伺服器

varnish學習筆記-後端伺服器

大部分情況下,

varnish

發給用戶端的資料都不是自己産生的,而是從後端伺服器擷取的(如果發的是緩存的内容,其起源也是後端伺服器),它充當的是反向代理和緩存的角色。

是以需要給

varnish

定義一個/多個後端伺服器,告訴它應該從哪裡擷取資料,可以選擇性的讓它從指定伺服器擷取資料。

1. 定義一個後端伺服器

使用

backend

指令來定義一個後端伺服器。最簡單的代碼如下:

backend default { # 該後端伺服器的名字為 default,後面可以用default來引用它
  .host = "127.0.0.1"; # 指定後端伺服器的IP
  .port = "8080";      # 指定後端伺服器的端口
}
           

vcl_recv

子程式中可以用

req.backend_hint = default

來顯式地指定請求命中的後端伺服器。如:

sub vcl_recv {
  set req.backend_hint = default;
}
           

2. 定義多個後端伺服器

也可以用

backend

指令定義多個後端伺服器。

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

backend php {
  .host = "127.0.0.1";
  .port = "8180";
}

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

如上代碼定義了

default

php

java

三個後端伺服器。

這三個後端伺服器又該如何使用呢?假如

php

是由Apache擔當,專門處理

.php

檔案,

java

是由Tomcat 擔當,專門處理

.jsp

檔案,其它的檔案則交給

default

對應的伺服器來處理。則

varnish

的配置檔案可以這樣寫:

vcl_recv {
  if (req.url ~ "(?i)\.php") {
    set req.backend_hint = php;
  } elsif (req.url ~ "(?i)\.jsp") {
    set req.backend_hint = java;
  } else {
    set req.backend_hint = default;
  }
}
           

如果沒有顯式選擇後端伺服器的話,

varnish

會選擇名為

default

的後端伺服器,如果沒有名為

default

的後端伺服器的話,則選擇

vcl

配置檔案中第一個找到的後端伺服器。

3.支援虛拟主機

上面我們是根據請求的url(

req.url

)來選擇後端伺服器的,當然也可以根據其他條件來選擇後端伺服器。

varnishs

也可以支援虛拟主機,這是通過HTTP的

Host

請求頭來實作的。如:

sub vcl_recv {
  if (req.http.host == "api.mysite.com") {
    set req.backend_hint = api; # 假設已經定義了一個名為 api 的後端伺服器
  } elsif (req.http.host == "app.mysite.com") {
    set req.backend_hint = app;  # 假設已經定義了一個名為 app 的後端伺服器
  }
}
           

4. 負載均衡 directors

當有多個後端伺服器提供同樣的服務時,

varnish

支援以負載均衡的方式向他們請求内容。該功能 由

directors

子產品提供,

directors

子產品是

varnish

的一個内置子產品,另一個内置子產品是

std

使用子產品前要用

import

指令導入該子產品。

需要在

vcl_init

子程式中定義一個後端伺服器組。

sub vcl_init {
  new my_servers = directors.round_robin(); # 負載均衡為輪詢模式
  my_servers.add_backend(server1); # 假設已經定義了一個名為 server1 的後端伺服器
  my_servers.add_backend(server2); # 假設已經定義了一個名為 server2 的後端伺服器
}
           

然後在

vcl_recv

中把請求命中到一個後端伺服器組。

sub recv {
  set req.backend_hint = my_servers.backend();
}
           

負載均衡還有其它模式,如

random

—— 随機選擇一個後端伺服器,

hash

—— 有會話保持功能的均衡。

add_backend

方法還可以支援傳第二個參數(real類型)作為權重。

有關

directors

子產品的更多内容可參考 directors子產品

5.健康檢查

負載均衡器一般都有健康檢查的功能,按指定的時間間隔、指定的檢查規則對後端伺服器進行檢查,判斷後端伺服器是否正常,如果不正常,則需要從後端伺服器擷取資料時,不向它發起請求。

varnish

的健康檢查示例配置如下:

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

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

以上配置表示每隔5秒向後端伺服器發起請求,逾時為1秒,請求的路徑為

"/"

,最近5個請求中有3個成功就認為後端伺服器是OK的。

關于varnish後端伺服器的學習就到此,詳情可以參考官方文檔

varnish

VCL的文檔可參考 https://varnish-cache.org/docs/5.2/reference/vcl.html

繼續閱讀