varnish安裝及配置詳解

varnish系統架構:

varnish主要運行兩個進程:Management進程和Child進程(也叫Cache進程)。

 

Management進程主要實現應用新的配置、編譯VCL、監控varnish、初始化varnish以及提供一個命令行接口等。Management進程會每隔幾秒鐘探測一下Child進程以判斷其是否正常運行,如果在指定的時長內未得到Child進程的迴應,Management將會重啓此Child進程。

 

Child進程包含多種類型的線程,常見的如:
Acceptor線程:接收新的連接請求並響應;
Worker線程:child進程會爲每個會話啓動一個worker線程,因此,在高併發的場景中可能會出現數百個worker線程甚至更多;
Expiry線程:從緩存中清理過期內容;

 

Varnish依賴“工作區(workspace)”以降低線程在申請或修改內存時出現競爭的可能性。在varnish內部有多種不同的工作區,其中最關鍵的當屬用於管理會話數據的session工作區

 

拓撲圖如下:

wKioL1NpzxTzDJ4aAAII0NpFqhs198.jpg

varnish緩存代理服務器配置:

一、/etc/sysconfig/varnish配置文件修改如下兩項:

wKioL1Np0JugTZZNAAHSPtkQbZE459.jpg

wKiom1Np0YCRNIJMAADpf03ee5I894.jpg

 

varnish的後端存儲

 varnish支持多種不同類型的後端存儲,這可以在varnishd啓動時使用-s選項指定。後端存儲的類型包括:
        (1)file:使用特定的文件存儲全部的緩存數據,並通過操作系統的mmap()系統調用將整個緩存文件映射至內存區域(如果條件允許);
        (2)malloc:使用malloc()庫調用在varnish啓動時向操作系統申請指定大小的內存空間以存儲緩存對象;
        (3)persistent(experimental):與file的功能相同,但可以持久存儲數據(即重啓varnish數據時不會被清除);仍處於測試期;

varnish無法追蹤某緩存對象是否存入了緩存文件,從而也就無從得知磁盤上的緩存文件是否可用,因此,file存儲方法在varnish停止或重啓時會清除數據。而persistent方法的出現對此有了一個彌補,但persistent仍處於測試階段,例如目前尚無法有效處理要緩存對象總體大小超出緩存空間的情況,所以,其僅適用於有着巨大緩存空間的場景。

選擇使用合適的存儲方式有助於提升系統性,從經驗的角度來看,建議在內存空間足以存儲所有的緩存對象時使用malloc的方法,反之,file存儲將有着更好的性能的表現。然而,需要注意的是,varnishd實際上使用的空間比使用-s選項指定的緩存空間更大,一般說來,其需要爲每個緩存對象多使用差不多1K左右的存儲空間,這意味着,對於100萬個緩存對象的場景來說,其使用的緩存空間將超出指定大小1G左右。另外,爲了保存數據結構等,varnish自身也會佔去不小的內存空間。

 

爲varnishd指定使用的緩存類型時,-s選項可接受的參數格式如下:
 malloc[,size] 或
 file[,path[,size[,granularity]]] 或
 persistent,path,size {experimental}

file中的granularity用於設定緩存空間分配單位,默認單位是字節,所有其它的大小都會被圓整。

 

二、使用VCL語言編寫varnish緩存代理服務器的緩存策略

         Varnish Configuration Language (VCL)是varnish配置緩存策略的工具,它是一種基於“域”(domain specific)的簡單編程語言,它支持有限的算術運算和邏輯運算操作、允許使用正則表達式進行字符串匹配、允許用戶使用set自定義變量、支持if判斷語句,也有內置的函數和變量等。使用VCL編寫的緩存策略通常保存至.vcl文件中,其需要編譯成二進制的格式後才能由varnish調用。事實上,整個緩存策略就是由幾個特定的子例程如vcl_recv、vcl_fetch等組成,它們分別在不同的位置(或時間)執行,如果沒有事先爲某個位置自定義子例程,varnish將會執行默認的定義。

        VCL策略在啓用前,會由management進程將其轉換爲C代碼,而後再由gcc編譯器將C代碼編譯成二進制程序。編譯完成後,management負責將其連接至varnish實例,即child進程。正是由於編譯工作在child進程之外完成,它避免了裝載錯誤格式VCL的風險。因此,varnish修改配置的開銷非常小,其可以同時保有幾份尚在引用的舊版本配置,也能夠讓新的配置即刻生效。編譯後的舊版本配置通常在varnish重啓時纔會被丟棄,如果需要手動清理,則可以使用varnishadm的vcl.discard命令完成。

 

在/etc/varnish目錄下創建以.vcl結尾的mycache.vcl配置文件

 

 

backend web1 {                   定義4臺web服務器,其中web1和web2
.host = "172.16.254.141";        提供靜態文本,web3和web4提供靜態圖片
.port = "80";
.probe = {
.url = "/index.html";
.window = 5;
.threshold = 2;
.interval = 3s;
}
}
backend web2 {
.host = "172.16.254.151";
.port = "80";
.probe = {
.url = "/index.html";
.window = 5;
.threshold = 2;
.interval = 3s;
}
}
backend web3 {
.host = "172.16.254.152";
.port = "80";
.probe = {
.url = "/index.html";
.window = 5;
.threshold = 2;
.interval = 3s;
}
}
backend web4 {
.host = "172.16.254.153";
.port = "80";
.probe = {
.url = "/index.html";
.window = 5;
.threshold = 2;
.interval = 3s;
}
}
director websrvs round-robin {   web1和web2定義爲一組名稱爲websrvs的
{                                director,相當於nginx的upstream,以
.backend = web1;                 便與在vcl_fetch狀態引擎中調用時,做
}                                到文本與圖片服務器的隔離
{
.backend = web2;
}
}
director websrvs1 round-robin {
{
.backend = web3;
}
{
.backend = web4;
}
}
acl purgers {             定義允許可以手動清除緩存的訪問控制列表
"127.0.0.1";
"172.16.0.0"/16;
}
sub vcl_recv {                        以.html或.css或.js結尾的url請求
if (req.url ~ "\.(html|css|js)$") {    如果本地沒有緩存,則會到directo
set req.backend = websrvs;               r爲websrvs服務器組去獲取數據
} else {
set req.backend = websrvs1;           其他的統統到websrvs1服務器組去
}                                       獲取數據,包括.png、.jpeg等結
}                                         尾的url請求。
sub vcl_recv {
#  set req.backend = websrvs;
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed.";
}
}
if (req.url ~ "test.html"){   如果某個rul不希望被varnish服務器緩存下來
return(pass);                 時,可以使用此方法定義。
}
return(lookup);
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged ok.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 404 "Not in cache.";
}
}
sub vcl_pass {
if (req.request == "PURGE") {
error 502 "Purged on a passed object.";
}
}
sub vcl_fetch {             設置緩存的有效時長。
if (req.url ~ "\.(jpg|jpeg|gif|png)$"){
set beresp.ttl = 7200s;
}
if (req.url ~ "\.(html|css|js)$"){
set beresp.ttl = 1200s;
}
}
sub vcl_deliver {       如果想讓客戶端看到請求到的數據是由哪臺原始
if (obj.hits > 0) {      服務器提供的,可以使用此方法定義。
set resp.http.X-Cache = "HIT from " + server.ip;
} else {
set resp.http.X-Cache = "MISS";
}
}

 

在命令行下使用varnishadm命令連接至varnish管理控制後臺

[root@localhost ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish> vcl.load mycache1 mycache   裝載定義好的vcl配置文件
varnish> vcl.use mycache1

 

 

測試結果不再給出,小夥伴們可以自己動手測試一下^-^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章