varnish基礎

varnish概念


初步認識

首先來跟我學習,v~a~r~n~i~s~h~~ ,學會了沒有~html

固然還有很重要的一個概念,它是高性能緩存服務器,舉個例子。web

比如咱們要去買東西,全部的咱們須要的東西是在超市廠家生產出來的,咱們須要的話去超市廠家取。這表明離服務器端近算法

在比如咱們要去超市買東西,這個超市廠家負責送貨到家門口樓下的超市,那咱們確定選擇離咱們本身近的。這就是表明離客戶端近chrome

而緩存的功能就是把客戶端常常須要「買」的東西送到客戶端門口,畢竟web的存在就是爲了給客戶端提供服務的,因此緩存是一個很是重要的概念。那怎麼把數據送到客戶端門口呢,咱們最常接觸的就是瀏覽器緩存,好比你訪問過一個網站,第一次打開須要加載,可是若是你打開了第二個頁面感受又想回到上一個頁面直接返回就能夠,此時並不須要從新加載,這就是緩存的一種。vim

緩存運行時聽從的理念

時間局部性:一個數據被訪問過以後,被統計接下來被訪問的機率。後端

空間局部性:一個數據被訪問時,周邊數據被訪問的機率。centos

這些稱爲緩存的熱區,那空間滿了怎麼辦?使用LRU算法,根據時間最近和頻率最少使用來清理緩存。瀏覽器

還有須要注意的一點是,以上全部的數據都是通過客戶端一段時間的訪問來統計出來的,並且要知道緩存是重啓失效的,因此你懂得,沒事能夠把服務器常常關機或者重啓試試,確定特別刺激。緩存

varnish程序選項以及配置


調用方式看下圖;

 

 

VCL語法格式:

/etc/varnish/default.vcl服務器

  • 必須以VCL 4.0;開始;
  • //,  # ,/* foo */  所有爲註釋;
  • 根據不一樣的需求把不一樣的配置寫進不一樣的配置段;
    • sub vcl_recv {

      }

    • sub vcl_backend_response {

      }

    • sub vcl_deliver {

      }

  • 終止語句return()沒有返回值;
  • 不支持循環;
  • 衆多內置變量,便令的可調用位置和state engine 有密切關係;
  • 支持衆多操做符,=賦值 ==等值比較 ~模式匹配 !取反  &&邏輯與  || 邏輯或;
  • 「域」專用語言只能用在特定的「域」上;

/etc/varnish/varnish.params

  • RELOAD_VCL=1  ##啓動時會不會自動加載VCL配置文件,1爲確認;
  • VARNISH_VCL_CONF=/etc/varnish/default.vcl  ##默認加載的緩存策略文件;
  • VARNISH_SECRET_FILE=/etc/varnish/secret  ##祕鑰文件存儲位置;
  • VARNISH_USER=varnish   ##所屬用戶
  • VARNISH_GROUP=varnish  ##所屬組

VCL配置文件重載:varnish_reload_vcl  

緩存存儲機制:

  • .malloc[,size]:內存存儲,size用來定義緩存空間大小,重啓失效。
  • .file,path[,size]:文件存儲,重啓失效。
  • .persistent,path,size:文件存儲,重啓有效,可是實驗階段不穩定不建議使用。

內置變量機制:

 req.*:request,表示由客戶端發來的請求報文相關;
 bereq.*:由varnish發往BE(後端主機)的httpd請求相關;
                        bereq.http.HEADERS
                        bereq.request:請求方法;
                        bereq.url:請求的url;
                        bereq.proto:請求的協議版本;
                        bereq.backend:指明要調用的後端主機;
                        req.http.Cookie:客戶端的請求報文中Cookie首部的值; 
                        req.http.User-Agent ~ "chrome"
 
beresp.*:由BE主機響應給varnish的響應報文相關;
resp.*:由varnish響應給client相關;
                    beresp.*, resp.*:
                        beresp.http.HEADERS
                        beresp.status:響應的狀態碼;
                        reresp.proto:協議版本;
                        beresp.backend.name:BE主機的主機名;
                        beresp.ttl:BE主機響應的內容的餘下的可緩存時長;
 
 obj.*:存儲在緩存空間中的緩存對象的屬性;只讀;
                        obj.hits:此對象從緩存中 命中的次數;
                        obj.ttl:對象的緩存時長
                         obj.grace :緩存時長寬限期
下面圖爲變量應用的位置以及是否可執行讀或寫;

 


使用兩個centos7.3實驗演示,看起來清晰一點。

centos 1 192.168.150.161 安裝httpd

centos 2 192.168.150.160 安裝varnish

編輯centos 1 httpd配置文件;

[root@localhost: script]# vim /var/www/html/index.html  <h1> centos7.3 httpd test page </h1>

systemcel start httpd ##啓動服務;

編輯centos 2 varnish 配置文件 ;

[root@localhost: script ]# vim /etc/varnish/varnish.params ##程序選項文件,配置varnish服務進程的工做特性,例如監聽地址端口以及緩存機制;

......

13 # VARNISH_LISTEN_ADDRESS=192.168.1.5 ##監聽在哪一個地址,這裏註釋了表明監聽在本機全部的IP;

14 VARNISH_LISTEN_PORT=80 ##監聽本機的哪一個端口默認爲6081;

15

16  # Admin interface listen address and port ##配置管理員選項;

17 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 ##監聽在本機那個IP;

18 VARNISH_ADMIN_LISTEN_PORT=9877 ##監聽在本機那個端口;

.....

24 # man page for details.

25 VARNISH_STORAGE="file,/data/varnish,1g" ##默認存在緩存中這裏配置爲存在磁盤,文件目錄,以及文件大小,目錄須要手動建立而且須要設置varnish用戶爲屬主與屬組;

......

[root@localhost: script ]# /etc/varnish/default.vcl ##配置各Child/Cache線程的緩存策略,先把httpd配置爲後端主機;

......

15 # Default backend definition. Set this to point to your content server.

16 backend default { ##定義後端主機;

17   .host ="192.168.150.161"; ##默認是127.0.0.1,改成httpd服務器IP;

18   .port = "80"; ##默認爲8080,改成80;

19   }

20

21 sub vcl_recv {

22

22

23   if (req.method != "GET" &&   ##設置默認策略,請求方法若是不是GET,HEAD,PUT,POST,TRACE,IPTIONS,DELETE,其中一個,則跳轉至pipe,避免有比較老的系統不能訪問網站;

24     req.method != "HEAD" &&

25     req.method != "PUT" &&

26     req.method != "POST" &&

27     req.method != "TRACE" &&

28     req.method != "OPTIONS" &&

29     req.method != "DELETE") {

30   return (pipe);

31   }

32

33   if (req.method != "GET" && req.method != "HEAD") {  ##若是請求方法不是GET,HEAD則跳轉至pass;

34     return (pass);

35   }

36   if (req.http.Authorization || req.http.Cookie) {   ##若是請求中有認證相關的信息或者cookie信息則跳轉至pass;

37     return (pass);

38   }

39   return (hash);

40  }

 

[root@station103: varnish]# mkdir /data/varnish -pv ##建立緩存文件目錄

systemctl start varnish ##啓動服務

使用瀏覽器訪問192.168.150.160 基本框架已經搭好。

 

 

配置centos 1

[root@localhost: varnish]# mkdir /var/www/html/{login,admin} -pv

[root@localhost: varnish]# echo 1111 >   /var/www/html/login/index.html

[root@localhost: varnish]# echo 1111 >   /var/www/html/admin/index.html

配置centos 2 

[root@localhost: varnish]# vim /etc/varnish/default.vcl

sub vcl_recv {   

  if (req.url ~ "(?i)^/(login|admin)") {  ##表示若是訪問的是login或者admin任何文件則去硬盤中找;
    return(pass);
  }

}

[root@localhost: varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:9877   ##交互式登陸 -S 指定祕鑰文件  -T 指定本機127.0.0.1以及本身配置的端口;

vcl.load test1 default.vcl    ##從default.vcl配置文件中裝載進緩存,命名爲 test1,須要注意,這裏是裝載進的緩存,重啓失效。使用vcl.show test1 能夠查看配置 加 -v顯示詳細配置;
200
VCL compiled.

vcl.list   ##查看全部列表,test1已經存在 可是非活動狀態;

200
active 0 boot
available 0 test1

vcl.use test1  ##啓用test1 
200
VCL 'test1' now active

查看訪問網頁 http://192.168.150.160/login/由於有關鍵字,摁F12,能夠看到並無緩存

 

[root@station103: varnish]# vim /etc/varnish/default.vcl

sub vcl_deliver {   ## 定義

  if (obj.hits>0) {    ##若是訪問記錄大於等於1次;
    set resp.http.X-Cache = "HIT via " + server.ip;    ## 自定義首部 爲HIT vai + IP,空格要本身加 看起來整齊一點;
  } else {   ##不然;
    set resp.http.X-Cache = "MISS via " + server.ip;   ## 自定義首部爲 MISS via ;
  }

}

記得本身要去 varnish交互式界面同步 ;

vcl.load test2 default.vcl  
200
VCL compiled.


vcl.use test2   ##生效新的配置test2
200
VCL 'test2' now active

第一次訪問 MISS 

 

第二次刷新 已經顯示HIT;

       

清緩存

ban(banning)爲禁用緩存 使用方法同樣 ;

vim /etc/varnish/default.vcl

acl purgers {   ##首先要定義組
  "127.0.0.1"/8;
  "192.168.150.160"/16;
}

sub vcl_recv {  

  if (req.method == "PURGE") {  ##若是請求方法是PURGE;
    if (!client.ip ~ purgers) {  ##基於上面的基礎 若是請求的IP 爲定義的acl控制purgers組內的IP;
      return(synth(405,"Purging not allowed for " + client.ip));  ##返回值爲405 中間加上內容 後面加上訪問者IP;
    }
  return(purge);  ##跳轉至PURGE;
  }  ##這樣若是客戶端請求過有緩存的話使用purge方法請求一次會清空緩存;在訪問就會MISS

}

 使用curl 方法指定請求方法來訪問驗證試驗結果;

[root@station103: /root]# curl -I http://192.168.150.160/index.html   ##先請求 爲HIT 表明有以前有緩存;
HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 11:35:42 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 62 52
Age: 112
Via: 1.1 varnish-v4
X-Cache: HIT via 192.168.150.160   ##顯示爲HIT
Connection: keep-alive

[root@station103: /root]# curl -X PURGE http://192.168.150.160/imdex.html<!DOCTYPE html>   ##使用PURGE 方法請求;
<html>
<head>
<title>405 Purging not allowed for 192.168.150.160</title>
</head>
<body>
<h1>Error 405 Purging not allowed for 192.168.150.160</h1>   ##返回值爲咱們設定的405 以及IP ;
<p>Purging not allowed for 192.168.150.160</p>
<h3>Guru Meditation:</h3>
<p>XID: 65584</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>


[root@station103: /root]# curl -I http://192.168.150.160/index.html   ##再次請求發現MISS;
HTTP/1.1 200 OK 
Date: Sat, 01 Jul 2017 11:38:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 65586
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS via 192.168.150.160  ##MISS 表明緩存已清空
Connection: keep-alive

 定義多個虛擬主機;

[root@station103: varnish]# vim /etc/varnish/default.vcl

13 vcl 4.0;
14
15 import directors;  ##首先必定要調用這個模塊,不然不能定義;
16
......
22 backend web1 {   ##定義backend主機1
23   .host ="192.168.150.161";
24   .port = "80";
25 }
26 backend web2 { ##定義backend主機2; 
27    .host ="192.168.150.152";  
28   .port = "80";
29 }
30 sub vcl_init { ##初始化組
31·        new web = directors.round_robin();  ##定義web爲組名,directors爲模塊, round_robin爲調度方法;
32    web.add_backend(web1);  ##添加主機1至web組,是能夠加權重的,若是加權重是這樣寫(web1,2)主機名字後面逗號隔開寫上權重;
33    web.add_backend(web2);  ##添加主機2至web組;
34 }
35
36
37 sub vcl_recv {
38
39    set req.backend_hint = web.backend();  ##調用組

40 }

此時添加了一個主機 centos 3 IP爲192.168.150.152

安裝httpd 

[root@localhost ~]# mkdir /var/www/html/{login,admin} -pv

[root@localhost ~]# echo centos7.3 httpd test page2 > /var/www/html/login/index.html

[root@localhost ~]# systemctl start httpd

centos 1 

[root@localhost: /root]# echo centos7.3 httpd test page1 > /var/www/html/login/index.html

由於須要測試,因此不能使用有緩存的文件,特意建立一個login目錄,(以前有設置過權限)內容不統一,方便查看測試效果。

輪詢效果實現;

 

 loading.....

相關文章
相關標籤/搜索