Linux中Varnish基礎應用

http  cache的實現方式有兩種: Squid、Varnish;一般被稱爲緩存服務器

Squid:支持正向和反向代理、是一款重量級的緩存服務器,在高負載的情況下,性能非常的穩定

Varnish:支持反向代理;相比於Squid是非常輕量級的緩存服務器,在高負載情況下,性能較差,沒有Squid穩定;一般被稱爲http加速器;


Varnish的特點:

一、組成部分

Management:作爲主控進程;提供命令行接口、管理各種子進程、初始化,加載文件等等

Child/Cache:緩存管理、日誌數據統計、接受用戶請求、對所有緩存做有效性在驗證,清理

VCL:Varnish的配置語言;緩存控制機制,調用C編譯器,生成二進制程序,讓子進程加載


二、工作模式:

1、請求的資源可緩存:

(1)當客戶端請求的資源命中了Varnish緩存且緩存未過期時,將直接響應給客戶端;

(2)Varnish作爲一臺反向代理緩存服務器,當客戶端請求的資源未命中Varnish緩存時,Varnish會扮演客戶端角色去後端主機請求數據,將請求到的資源先緩存到本地,隨後再將請求到的資源發送給客戶端。

(3)當客戶端請求的資源命中了Varnish緩存,但是Varnish上的緩存已過期時,則Varnish會去後端主機確認請求原始資源是否更新;如果未更新,則後端主機僅響應資源首部給Varnish,隨後Varnish再將響應資源發送給客戶端;如果請求原始資源更新,則後端主機將會響應新的資源給Varnish,Varnish將響應的資源緩存在本地之後再響應給客戶端;如果請求的資源後端主機已刪除,則Varnish中的緩存也會被刪除,響應給客戶端404頁面

2、請求的資源不可緩存:

(1)當客戶端請求的資源爲不可緩存時,Varnish會直接去後端主機取得相應內容直接返回給客戶端;而不是先緩存到本地再響應給客戶端


衡量一個緩存的有效性:

緩存的命中率:

  文檔命中率:也稱爲資源命中率,從文檔的個數進行衡量

  字節命中率:從內容的大小進行衡量

緩存的生命週期:

  緩存項過期:惰性清理

  緩存空間用盡:使用LRU算法(最近最少使用算法)

注意:當一個緩存項過期時並不會真正從內存中青旅,只是標記爲失效,而不是把它刪除;當內存空間用盡時,纔會真正的刪除緩存項


三、緩存模式:

(1)file:緩存再磁盤的文件中,自行管理的關鍵系統

(2)malloc:內存緩存;使用malloc()庫調用,在varnish啓動時向內存申請指定大小的空間進行緩存

(3)presistent:存儲在磁盤上;


四、緩存新鮮度檢測機制

有效性在驗證:

  如果原始內容發生改變,則僅響應首部(不用到body部分;響應碼爲304(Not  Modified)

  如果原始內容發生了改變,則正常響應給客戶端,響應碼爲200

  如果原始內容消失,則響應404,此時緩存中的緩存項(object)也應該被刪除

條件式請求首部:

  If-Modified_Since:基於原始內容的最近一個修改的時間戳進行驗證

  If-Ummodified_since:如果緩存發生了改變,響應304

  If-Match:基於請求內容的匹配做驗證

  If-None_match:基於Etag比較進行內容驗證


五、緩存控制機制

  過期日期:

   HTTP/1.0 Expires:給與的是絕對時長

    例如:Expires:Thu, 04 Jun 2015 23:38:18 GMT

   HTTP/1.1 Cache-Control: max-age給與的是相對時長,從接受到相應報文開始

   例如:Cache-Control:max-age=700


六、VCL相關的狀態引擎

vcl_recv:接受請求

vcl_hash:

  hit:vcl_hit:命中緩存

  miss:vcl_miss:未命中緩存

  purge:vcl_purge:清除緩存

  pipe:vcl_pipe:管道;直接發送給後端主機

  pass、hit_for_pass:vcl_pass  ##跳過,直接請求後端主機


vcl_backend_fetch:讀取數據

vcl_backend_response:後端主機響應

vcl_backend_error:後端主機響應錯誤碼


vcl_synth:同步


vcl_deliver:響應給客戶端


七、VCL的語法格式

(1)表示註釋://、#、/*……*/

(2)定義子例程

(3)不支持循環、支持條件判斷

(4)具有內建變量

(5)使用終止語句return,沒有返回值

(6)支持操作符:=、==、!=、&&、||


八、VCl內建變量

req.*:只匹配客戶端發來的請求

    req.http.*:匹配http請求報文的任何首部

    bereq.*:由varnish向後端主機發出http請求

    beresp.*:由後端主機發來http的響應報文首部

    resp.*:由varnish響應給客戶端的http的響應報文

    obj.*:存儲在緩存空間中的緩存的對應屬性


    常用的變量:

    berep:varnish向後端主機請求資源

    bereq.request:請求方法(向後端主機發送請求報文)

    bereq.url:請求的url

    bereq.proto:請求協議

    bereq.backend:指明要調用的後端主機是那個


    beresp:後端主機向varnish響應資源

    beresp.proto:響應協議

    beresp.status:響應的狀態碼

    beresp.reason:響應原因

    beresp.backend.name:後端主機名稱

    beresp.ttl:後端主機請求中的內容的餘下的生存時長      

      

    obj.hits:此對象從緩存中命中的次數

    obj.ttl:對象的ttl值;也被稱爲緩存時長


        

準備環境:CentOS  7

Varnish服務器
IP:172.18.42.200
後端主機1:提供httpd服務
IP:172.18.42.201
後端主機2:提供httpd服務
IP:172.18.42.202


一、Varnish服務器配置

1、安裝varnish

[root@node0 ~]# yum install varnish
[root@node0 ~]# ll /etc/varnish/
total 20
-rw-r--r-- 1 root root 1155 May 20 17:07 default.vcl  ##配置Varnish緩存策略
-rw-r--r-- 1 root root 1224 May 20 11:10 default.vcl.wtc
-rw------- 1 root root   37 May 20 11:09 secret
-rw-r--r-- 1 root root 1200 Mar 16  2015 varnish.params   ##配置緩存機制
-rw-r--r-- 1 root root 1200 May 20 11:12 varnish.params.bak

2、更改varnish的緩存模式:

[root@node0 varnish]# vim varnish.params   
#VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G"  ##默認的緩存機制
VARNISH_STORAGE="malloc,1G"   ##更改緩存爲malloc模式

 

3、定義後端主機

[root@node0 varnish]# vim default.vcl  ##
backend default {
    .host = "172.18.42.202";    ##後端主機1
    .port = "80";    ##web80端口
}


二、配置後端主機

1、後端主機1安裝httpd、php

[root@node1 ~]# yum install httpd -y
[root@node1 html]# systemctl start httpd.service

2、後端主機2安裝httpd

[root@node2 ~]# yum install nginx
[root@node2 nginx]# nginx


三、配置default.vcl緩存策略

1、當請求資源可緩存時,查看緩存是否命中

sub vcl_deliver {
if (obj.hits>0) {
        set resp.http.X-Cache = "HIT";
    }
    else {
        set resp.http.X-Cache = "MISS";
    }
}    ##如果請求的資源未命中則顯示MISS、命中則顯示HIT

第一次請求:

wKioL1dAcE2BhLt7AABWCa7dkgA789.jpg

第二次請求:命中了varnish緩存

wKiom1dAbwqRkDH-AABdQ8JxTbo577.jpg


2、強制對某些資源不檢查緩存

[root@node2 ~]# mkdir /web/lweim/wtc   ##在後端主機新目錄“wtc”
[root@node2 ~]# vim  /web/lweim/wtc/index.html    
sub vcl_recv {
if (req.url ~ "(?i)^/wtc") {
        return(pass);
    }
}    ##當請求的url當中有“wtc”時,則不會去命中緩存,而是直接由varnish請求後端主機

第一次請求:

wKioL1dAdXnDCyg8AABmQv8kXAU463.jpg

第二次請求:

wKiom1dAdRei1oj3AABlZ4C8yfw079.jpg


3、定義多臺後端主機

backend  web2 {
    .host = "172.18.42.202";
    .port = "80";
}
backend web1 {
    .host = "172.18.42.201";
    .port = "80";
}
sub vcl_recv {
    if (req.url ~ "(?i)\.php$") {
        set req.backend_hint = web1;   ##當請求url中有php時,則是後端主機web1來響應
                return(pass);
    }
    else {
        set req.backend_hint = web2;   ##url中沒有php的請求都由後端主機web2來響應
                return(pass);
    }
}

第一次請求靜態資源

wKiom1dCrZngRHAuAABmWsflrhU854.jpg

第二次請求php

wKioL1dCrwTDnJSTAAClRv5XwpU328.jpg


4、實現負載均衡

import directors;    ##定義一個主機組

backend web1 {       ##定義第一個後端服務器
    .host = "172.18.42.201";
    .port = "80";
}

backend  web2 {      ##定義第二個後端服務器
    .host = "172.18.42.202";
    .port = "80";
}

sub vcl_init {      ##定義一個服務器組
    new web = directors.round_robin();
    web.add_backend(web1);
    web.add_backend(web2);
}
sub vcl_recv {
    if (req.url ~ "(?i)^/wtc") {
        set req.backend_hint = web.backend();
        return(pass);  ##直接請求後端主機服務器
     }
}

第一次請求:

wKiom1dCta7DgpqJAABZO1KlCxQ412.jpg

第二次請求:

wKioL1dCtr3iaNyTAABZZvVV5PY414.jpg


5、對後端主機做健康檢測

backend web1 {
    .host = "172.18.42.201";
    .port = "80";
    .probe = {
        .url = "/";
        .interval = 1s;  ##每隔多長時間檢測一次
        .window = 8;     ##指定後端主機要檢測多少次
        .threshold 5;    ##指定至少要有幾次是檢測成功的
        .timeout 2s;     ##指定檢測時間的超時時長;默認爲2s
}


6、修改varnish運行時命令參數

[root@node0 varnish]# varnishstat
MAIN.pools                          4         0.00          .           4.00
[root@node0 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
param.set thread_pools 2
200      ##響應碼爲200即爲修改成功
[root@node0 varnish]# varnishstat
MAIN.pools                          2         0.00          .           2.00


7、查看varnish的工作狀態及其相關信息

[root@node0 varnish]# varnishstat

wKioL1dCvQXCzSzxAAAgrd9BP8A513.png

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