真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   小生博客:http://xsboke.blog.51cto.com

創(chuàng)新互聯(lián)公司是專業(yè)的巴里坤哈薩克網(wǎng)站建設(shè)公司,巴里坤哈薩克接單;提供成都做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行巴里坤哈薩克網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

   

  

 

                             -------謝謝您的參考,如有疑問,歡迎交流


目錄

  • varnishi簡介

  • varnish配置組成

--------------------------------------  vcl內(nèi)置預(yù)設(shè)變量

--------------------------------------  功能語句與對象

--------------------------------------  varnish中內(nèi)置子程序

--------------------------------------  varnish緩存模式和子程序的關(guān)系

  • varnish的安裝

  • varnish實(shí)例配置解析

  • 啟動(dòng)varnish

  • varnish acl配置解析


一、 Varnish簡介

  1. 作用

  • Web應(yīng)用加速器,同時(shí)作為http反向緩存代理

  2. 特點(diǎn)

  • Varnish可以使用內(nèi)存也可以使用硬盤進(jìn)行數(shù)據(jù)緩存

  • 支持虛擬內(nèi)存的使用

  • 有精確的時(shí)間管理機(jī)制

  • 狀態(tài)引擎架構(gòu):通過特定的配置語言設(shè)計(jì)不同的語句

  • 以二叉堆格式管理緩存數(shù)據(jù)

  3. Varnish的優(yōu)勢

  • Varnish訪問速度快,因?yàn)椴捎昧恕癡isual Page Cache”技術(shù),在讀取數(shù)據(jù)時(shí)直接從內(nèi)存中讀取

  • Varnish支持更多的并發(fā)連接,因?yàn)関arnish的TCP連接比squid快

  • Varnish通過管理端口,使用正則表達(dá)式批量的清除部分緩存

  4. Varnish的劣勢

  • 進(jìn)程一旦crash或重啟,緩存的數(shù)據(jù)將從內(nèi)存中完全釋放

  • 在多臺(tái)varnish實(shí)現(xiàn)負(fù)載均衡時(shí),每次請求都會(huì)落到不同的varnish服務(wù)器中,造成url請求可能會(huì)穿透到后端

    1)劣勢解決方案

    A、在varnish的后端添加squid/nignx代理,這樣防止了當(dāng)varnish緩存被清空時(shí),瞬間大量的請求發(fā)往web服務(wù)器

    B、在負(fù)載均衡上做url哈西,讓單個(gè)url請求固定請求到一臺(tái)varnish服務(wù)器上

  5. Varnish的組成

   1) Management進(jìn)程(管理進(jìn)程)

     對child進(jìn)程進(jìn)行管理,同時(shí)對vcl配置進(jìn)行編譯

   2) Child進(jìn)程(子進(jìn)程)

     生成線程池,負(fù)責(zé)處理用戶請求

  6. Varnish配置組成

l  后端配置:指定后端服務(wù)器

l  ACL配置:為varnish添加訪問控制列表,用于規(guī)則設(shè)置

l  Probes配置:實(shí)現(xiàn)后端服務(wù)器的健康檢查

l  Directors配置:為varnish添加集群

l  核心子進(jìn)程:為后端服務(wù)器、緩存、訪問控制、錯(cuò)誤處理等功能添

一、 arnish配置簡介

  1. vcl內(nèi)置預(yù)設(shè)變量

    Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

  • 這些變量一般用于設(shè)置各個(gè)階段的對象值

  • 預(yù)設(shè)變量是系統(tǒng)固定的,請求進(jìn)入vcl子程序后便生成,這些變量可以方便子進(jìn)程進(jìn)行提取或者自定義

  • 格式一般為:階段  .對象運(yùn)算符值

1)階段

  • Req:處理客戶端發(fā)送的請求時(shí)使用

  • Bereq:處理varinish向后端服務(wù)器發(fā)送的請求時(shí)使用

  • Beresp:處理后端服務(wù)器響應(yīng)時(shí)使用,用于varnish未緩存前

  • Resp:處理返回給客戶端的響應(yīng)時(shí)使用

  • Obj:處理存儲(chǔ)在內(nèi)存中的對象時(shí)使用

2)對象

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   3)   運(yùn)算符

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

  2. 功能語句與對象

l  一般功能語句都用于匹配對象,就是對某個(gè)對象實(shí)現(xiàn)什么操作

l  格式為:功能語句(對象)

1)功能語句

  • ban():清除指定對象緩存

  • call():調(diào)用子程序

  • hash_data():生成hash鍵值,只能在vcl_hash子程序中使用

  • new():創(chuàng)建一個(gè)vcl對象,只能在vcl_init子程序中使用

  • return():結(jié)束當(dāng)前子程序并執(zhí)行下一步動(dòng)作

  • rollback():恢復(fù)http頭到原來的狀態(tài),現(xiàn)在使用std.rollback()代替。

  • .synthetic():合成器,用于自定義一個(gè)響應(yīng)內(nèi)容,只能在vcl_synth和vcl_backend_error子程序中使用

  • regsub(待處理字符,正則表達(dá)式,替換為的字符):使用正則替換第一次出現(xiàn)的字符串

  • regsuball(待處理字符,正則表達(dá)式,替換為的字符):使用正則替換所有字符串

2)return的常用動(dòng)作

  語法:return(action)

  • abandon:放棄處理,并生成一個(gè)錯(cuò)誤。

  • deliver:交付處理

  • fetch:從后端取出響應(yīng)對象

  • hash:哈希緩存處理

  • lookup:從緩存中查找應(yīng)答數(shù)據(jù)并返回,如果查找不到,則調(diào)用pass函數(shù),從后端服務(wù)器調(diào)用數(shù)據(jù)。

  • ok:繼續(xù)執(zhí)行

  • pass:繞過緩存,直接向后端服務(wù)器調(diào)用數(shù)據(jù)

  • pipe:建立客戶端和后端服務(wù)器之間的直接連接,從后端服務(wù)器調(diào)用數(shù)據(jù)

  • purge:清除緩存對象,構(gòu)建響應(yīng)

  • restart:重新開始

  • retry:重試后端處理

  • synth(status code,reason):合成返回客戶端狀態(tài)信息

  3. varnish中內(nèi)置子程序

  • 子進(jìn)程也叫狀態(tài)引擎,每一個(gè)狀態(tài)引擎均有自己限定的返回動(dòng)作  return (動(dòng)作);  不同的動(dòng)作將調(diào)用對應(yīng)下一個(gè)狀態(tài)引擎。

  • 我們可以把一個(gè)請求分為多個(gè)階段,每個(gè)階段都會(huì)調(diào)用不同的狀態(tài)引擎去操作,這樣,我們只要編寫出相應(yīng)的狀態(tài)引擎,就可以控制每個(gè)請求階段。

  • varnish內(nèi)置子程序均有自己限定的返回動(dòng)作  return (動(dòng)作);  不同的動(dòng)作將調(diào)用對應(yīng)下一個(gè)子程序

  • 每個(gè)內(nèi)置子程序都需要通過關(guān)鍵字sub進(jìn)行定義

   1) vcl_recv子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   2) vcl_pipe子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   3) vcl_pass子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   4) vc_hit子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   5) vcl_miss子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   6) vcl_hash子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

    7) acl_purge子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   8) vcl_deliver子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   9) vcl_backend——fetch子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   10) vcl_backend_response子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   11) vcl_backend_error子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   12) vcl_synth子程序

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   13) vcl_init子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   14) acl_fini子進(jìn)程

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

4. varnish緩存模式和子程序的關(guān)系

l  varnish的配置文件,就是通過各種子程序組成的,當(dāng)varnish運(yùn)行時(shí),也是通過子程序的配置進(jìn)行相應(yīng)的操作

l 子程序的關(guān)系如下圖

    Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   1) 右上角的兩個(gè)圖代表:加載vcl時(shí)執(zhí)行vcl_init子程序,卸載vcl時(shí)執(zhí)行vcl_fini子程序

   2) 當(dāng)vcl_recv調(diào)用 hash函數(shù)時(shí)

     進(jìn)入該狀態(tài)后,會(huì)通過vcl_hash子程序,根據(jù)請求的url或其他信息生成hash鍵值,

     然后查找hash鍵值相同的緩存數(shù)據(jù),若找到,則進(jìn)入val_hit狀態(tài),否則進(jìn)入vcl_miss狀態(tài)

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   3) 當(dāng)vcl_recv調(diào)用pass 函數(shù)時(shí)

  • 當(dāng)vcl_recv調(diào)用pass 函數(shù)時(shí),pass將當(dāng)前請求直接轉(zhuǎn)發(fā)到后端服務(wù)器。而后續(xù)的請求仍然通過varnish處理。

  • pass (varnish)通常只處理靜態(tài)頁面。即只在GET 和 HEAD 類型的請求中時(shí)才適合調(diào)用pass函數(shù)。另外,需要注意的一點(diǎn)是,pass模式不能處理POST請求,為什么呢?因?yàn)镻OST請求一般是發(fā)送數(shù)據(jù)給服務(wù)器,需要服務(wù)器接收數(shù)據(jù),并處理數(shù)據(jù),反饋數(shù)據(jù)。是動(dòng)態(tài)的,不作緩存

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   4) 當(dāng)vcl_recv判斷需要調(diào)用 pipe 函數(shù)時(shí)

  • 當(dāng)vcl_recv判斷需要調(diào)用 pipe 函數(shù)時(shí),varnish會(huì)在客戶端和服務(wù)器之間建立一條直接的連接,之后客戶端的所有請求都直接發(fā)送給服務(wù)器,繞過varnish,不再由varnish檢查請求,直到連接斷開。

  • 類型是POST時(shí)用pipe,舉個(gè)例子,當(dāng)客戶端在請求一個(gè)視頻文件時(shí),或者一個(gè)大的文檔,如.zip .tar 文件,就需要用pipe模式,這些大的文件是不被緩存在varnish中的。

    Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

   5) 當(dāng)vcl_recv指定purge模式時(shí)

      Purge模式用于清除緩存

  5. 優(yōu)雅模式garce mode

1) 請求合并

  • 當(dāng)幾個(gè)客戶端請求同一個(gè)頁面的時(shí)候,varnish只發(fā)送一個(gè)請求到后端服務(wù)器,然后讓其他幾個(gè)請求掛起并等待返回結(jié)果

2) 問題

  • 如果數(shù)以千計(jì)或更多的這種請求同時(shí)出現(xiàn),那么這個(gè)等待隊(duì)列將變得龐大,這將導(dǎo)致2類潛在問題:驚群問題(thundering herd problem),即突然釋放大量的線程去復(fù)制后端返回的結(jié)果,將導(dǎo)致負(fù)載急速上升;沒有用戶喜歡等待;

3) 解決問題

  • 配置varnish在緩存對象因超時(shí)失效后再保留一段時(shí)間,以給那些等待的請求返回過去的文件內(nèi)容(stale content)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14


案例:
  Sub vcl_recv {
     If (! req.backend.healthy) {        判斷如果不健康
       set req.grace = 5m;varnish向前端提供5分鐘的過期內(nèi)容
     }
     else {                            如果健康
       set req.grace = 15s;varnish向前段提供15秒的過期內(nèi)容
     }
   }
 
   sub vcl_fetch {
       set beresp.grace = 30m;將失效的緩存對象再多保留30分鐘
   }

三、 varnish的安裝

  1. 下載varnish壓縮包

    有兩個(gè)地方可下載

   1) 通過Varnish的官方網(wǎng)址http://varnish-cache.org,可以在這里下載最新版本的軟件。

     但是有時(shí)候varnish的官網(wǎng)會(huì)被墻

   2) GIT下載:git clone https://github.com/varnish/Varnish-Cache/var/tmp/

     但是在安裝時(shí)需要先使用./autogen.sh生成configure編譯配置文件

  2. Varnish的安裝

     首先安裝依賴包

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     配置varnish

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     編譯并安裝

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     拷貝vcl文件

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     官方提供的vcl配置文件沒有提示太多的配置信息,在生產(chǎn)環(huán)境中還是需要自己進(jìn)行配置

四、 Varnish VCL實(shí)例配置解析

  拓?fù)洵h(huán)境

   Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

五、 啟動(dòng)varnish

   Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

六、 varnish vcl配置解析

   Varnish有自己的編程語法vcl,varnish啟動(dòng)時(shí),會(huì)將配置文件編譯為C語言,然后再執(zhí)行

  1. 后端服務(wù)器地址池配置及后端服務(wù)器健康檢查

   1)   后端服務(wù)器定義,用于varnish連接指定的后端服務(wù)器

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


例:將監(jiān)控塊定義在后端服務(wù)器中
    backend web{
        .host="192.168.31.83";指定后端服務(wù)器的IP
        .port="80";后端服務(wù)器的暴露端口
        .probe={    直接追加監(jiān)控塊.probe是一個(gè)的參數(shù)
            .url="/";
            .timeout=2s;
         }
     }
或:先定義監(jiān)控塊,在定義后端服務(wù)器列表
    probe web_probe{    監(jiān)控必需定義在前面,否則后端調(diào)用找不到監(jiān)控塊。
        .url="/";
        .timeout=2s;
    }
 
    backend web{
        .host="192.168.31.83";
        .port="80";
        .probe=web_probe;   調(diào)用外部共用監(jiān)控塊
    }

   2)   監(jiān)視器定義

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

     Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

1
2
3
4
5
6
7
8


例:創(chuàng)建健康監(jiān)測,定義健康檢查名稱為backend_healthcheck
    probe backend_healthcheck {   創(chuàng)建名為backend_healthcheck的健康檢查
       .url = "/";監(jiān)控入口地址為/的
       .timeout = 1s;請求超時(shí)時(shí)間
       .interval = 5s;每次輪詢間隔5秒
       .window = 5;輪詢5次
       .threshold = 3;必須有3次輪詢正常才算該節(jié)點(diǎn)正常
    }

   3)   負(fù)載均衡群集directors

  • 負(fù)載均衡群集需要directors模塊的支持,import directors

  • Directors負(fù)載均衡支持的算法:

      使用random,hash 必須配置權(quán)重值,用于提高隨機(jī)率

      Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


例:
 
    加載directors模塊
    import directors;
  
    配置后端服務(wù)器
    backend web1 {
        .host = "192.168.0.10";
        .port = "80";
        .probe = backend_healthcheck;
    }
    backend web2 {
    .host = "192.168.0.11";
    .port = "80";
    .probe = backend_healthcheck;
    }
  
    初始化處理
    sub vcl_init {           
    調(diào)用vcl_init初始化子程序創(chuàng)建后端主機(jī)組,即directors
        new  web_cluster =directors.round_robin();
        使用new關(guān)鍵字創(chuàng)建drector對象,使用round_robin算法
        web_cluster.add_backend(web1);
        添加后端服務(wù)器節(jié)點(diǎn)
        web_cluster.add_backend(web2);
    }
    
    開始處理請求
    sub vcl_recv {
    調(diào)用vcl_recv子程序,用于接收和處理請求
        set req.backend_hint = web_cluster.backend();
        選取后端
    }

說明:

  • set命令是設(shè)置變量

  • unset命令是刪除變量

  • web_cluster.add_backend(backend , real );  添加后端服務(wù)器節(jié)點(diǎn),backend 為后端配置別名,real 為權(quán)重值,隨機(jī)率計(jì)算公式:100 * (當(dāng)前權(quán)重 / 總權(quán)重)。

  • req.backend_hint是varnish的預(yù)定義變量,作用是指定請求后端節(jié)點(diǎn)

  • vcl對象需要使用new關(guān)鍵字創(chuàng)建,所有可創(chuàng)建對象都是內(nèi)定的,使用前必需import,所有new操作只能在vcl_init子程序中。

  2. 訪問控制列表(acl)

  • 創(chuàng)建一個(gè)地址列表,用于后面的判斷

  • 如果列表中包含了無法解析的主機(jī)地址,它會(huì)匹配任何地址。

  • 不想匹配的IP,在前面加個(gè)!即可

      Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

  3. 緩存規(guī)則設(shè)置

Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

    說明:

  • X-Forwarded-For 是用來識(shí)別通過HTTP代理或負(fù)載均衡方式連接到Web服務(wù)器的客戶端最原始的IP地址的HTTP請求頭字段

  • 要想后端服務(wù)器記載客戶端的真實(shí)IP,只在varnish中設(shè)置不行,還需要修改后端web服務(wù)器的配置(這里是apache做后端web服務(wù)器):

      Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析

       修改框中的變量,指定為varnish中設(shè)置的變量

七、 varnish將不同的url發(fā)送到不同的后端server

 AutoIt Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58


import directors;   # load the directors
backend web1 {
.host = "192.168.0.10";
.port = "80";
.probe = backend_healthcheck;
}
backend web2 {
.host = "192.168.0.11";
.port = "80";
.probe = backend_healthcheck;
}
定義后端服務(wù)器web1和web2


backend img1 {
    .host = "img1.lnmmp.com";
    .port = "80";
    .probe = backend_healthcheck;
}
backend img2 {
    .host = "img2.lnmmp.com";
    .port = "80";
    .probe = backend_healthcheck;
}
定義后端服務(wù)器img1和img2



//初始化處理
sub vcl_init {            
//調(diào)用vcl_init初始化子程序創(chuàng)建后端主機(jī)組,即directors
    new  web_cluster = directors.round_robin(); 
    //使用new關(guān)鍵字創(chuàng)建drector對象,使用round_robin算法
      web_cluster.add_backend(web1);
      //添加后端服務(wù)器節(jié)點(diǎn)
      web_cluster.add_backend(web2);
    new img_cluster = directors.random();
    //創(chuàng)建第二個(gè)集群
      img_cluster.add_backend(img1,2); 
      添加后端服務(wù)器節(jié)點(diǎn),并且設(shè)置權(quán)重值
      img_cluster.add_backend(img2,5);
}


//根據(jù)不同的訪問域名,分發(fā)至不同的后端主機(jī)組
sub vcl_recv {
   if (req.http.host  ~  "(?i)^(www.)?benet.com$") { 
       如果請求頭為www.benet.com或benet.com
         set  req.http.host = "www.benet.com";
         set  req.backend_hint = web_cluster.backend();  //選取后端
   } 
   elsif (req.http.host  ~  "(?i)^images.benet.com$") {
        set  req.backend_hint = img_cluster.backend();
    }
}
說明:中的i就是忽略大小寫的意思。(?i)表示開啟忽略大小寫,而(?-i)表示關(guān)閉忽略大小寫


新聞標(biāo)題:Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析
本文地址:http://weahome.cn/article/jhohoo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部