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能夠定義多個後端,也能夠將幾個後端放在一個後端集羣裏面已達到負載均衡的目的。後端
某些狀況下你可能須要讓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; }
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。能夠提升性能和彈性(增長一臺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就是幹這事的!
如今咱們給一個調度器設置兩個後端和健康檢測。先定義後端:
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.