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