91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Web架構:varnish緩存代理服務器超詳細剖析

發布時間:2020-10-25 21:52:47 來源:網絡 閱讀:1016 作者:小生博客 欄目:建站服務器

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

   

  

 

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


目錄

  • varnishi簡介

  • varnish配置組成

--------------------------------------  vcl內置預設變量

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

--------------------------------------  varnish中內置子程序

--------------------------------------  varnish緩存模式和子程序的關系

  • varnish的安裝

  • varnish實例配置解析

  • 啟動varnish

  • varnish acl配置解析



一、 Varnish簡介

  1. 作用

  • Web應用加速器,同時作為http反向緩存代理

  2. 特點

  • Varnish可以使用內存也可以使用硬盤進行數據緩存

  • 支持虛擬內存的使用

  • 有精確的時間管理機制

  • 狀態引擎架構:通過特定的配置語言設計不同的語句

  • 以二叉堆格式管理緩存數據

  3. Varnish的優勢

  • Varnish訪問速度快,因為采用了“Visual Page Cache”技術,在讀取數據時直接從內存中讀取

  • Varnish支持更多的并發連接,因為varnishTCP連接比squid

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

  4. Varnish的劣勢

  • 進程一旦crash或重啟,緩存的數據將從內存中完全釋放

  • 在多臺varnish實現負載均衡時,每次請求都會落到不同的varnish服務器中,造成url請求可能會穿透到后端

    1)劣勢解決方案

    A、varnish的后端添加squid/nignx代理,這樣防止了當varnish緩存被清空時,瞬間大量的請求發往web服務器

    B、在負載均衡上做url哈西,讓單個url請求固定請求到一臺varnish服務器上

  5. Varnish的組成

   1)  Management進程(管理進程)

     對child進程進行管理,同時對vcl配置進行編譯

   2)  Child進程(子進程)

     生成線程池,負責處理用戶請求

  6. Varnish配置組成

l  后端配置:指定后端服務器

l  ACL配置:為varnish添加訪問控制列表,用于規則設置

l  Probes配置:實現后端服務器的健康檢查

l  Directors配置:為varnish添加集群

l  核心子進程:為后端服務器、緩存、訪問控制、錯誤處理等功能添

一、 arnish配置簡介

  1. vcl內置預設變量

    Web架構:varnish緩存代理服務器超詳細剖析

  • 這些變量一般用于設置各個階段的對象值

  • 預設變量是系統固定的,請求進入vcl子程序后便生成,這些變量可以方便子進程進行提取或者自定義

  • 格式一般為:階段  .對象運算符值

1)階段

  • Req:處理客戶端發送的請求時使用

  • Bereq:處理varinish向后端服務器發送的請求時使用

  • Beresp:處理后端服務器響應時使用,用于varnish未緩存前

  • Resp:處理返回給客戶端的響應時使用

  • Obj:處理存儲在內存中的對象時使用

2)對象

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

   3)   運算符

     Web架構:varnish緩存代理服務器超詳細剖析

  2. 功能語句與對象

l  一般功能語句都用于匹配對象,就是對某個對象實現什么操作

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

1)功能語句

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

  • call():調用子程序

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

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

  • return():結束當前子程序并執行下一步動作

  • rollback():恢復http頭到原來的狀態,現在使用std.rollback()代替。

  • .synthetic():合成器,用于自定義一個響應內容,只能在vcl_synthvcl_backend_error子程序中使用

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

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

2)return的常用動作

  語法:returnaction

  • abandon:放棄處理,并生成一個錯誤。

  • deliver:交付處理

  • fetch:從后端取出響應對象

  • hash:哈希緩存處理

  • lookup:從緩存中查找應答數據并返回,如果查找不到,則調用pass函數,從后端服務器調用數據。

  • ok:繼續執行

  • pass:繞過緩存,直接向后端服務器調用數據

  • pipe:建立客戶端和后端服務器之間的直接連接,從后端服務器調用數據

  • purge:清除緩存對象,構建響應

  • restart:重新開始

  • retry:重試后端處理

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

  3. varnish中內置子程序

  • 子進程也叫狀態引擎,每一個狀態引擎均有自己限定的返回動作  return (動作);  不同的動作將調用對應下一個狀態引擎。

  • 我們可以把一個請求分為多個階段,每個階段都會調用不同的狀態引擎去操作,這樣,我們只要編寫出相應的狀態引擎,就可以控制每個請求階段。

  • varnish內置子程序均有自己限定的返回動作  return (動作);  不同的動作將調用對應下一個子程序

  • 每個內置子程序都需要通過關鍵字sub進行定義

   1) vcl_recv子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   2) vcl_pipe子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   3) vcl_pass子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   4) vc_hit子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   5) vcl_miss子進程

     Web架構:varnish緩存代理服務器超詳細剖析

   6) vcl_hash子進程

     Web架構:varnish緩存代理服務器超詳細剖析

    7) acl_purge子進程

     Web架構:varnish緩存代理服務器超詳細剖析

   8) vcl_deliver子進程

     Web架構:varnish緩存代理服務器超詳細剖析

   9) vcl_backend——fetch子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   10) vcl_backend_response子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   11) vcl_backend_error子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   12) vcl_synth子程序

     Web架構:varnish緩存代理服務器超詳細剖析

   13) vcl_init子進程

     Web架構:varnish緩存代理服務器超詳細剖析

   14) acl_fini子進程

     Web架構:varnish緩存代理服務器超詳細剖析

4. varnish緩存模式和子程序的關系

l  varnish的配置文件,就是通過各種子程序組成的,當varnish運行時,也是通過子程序的配置進行相應的操作

l 子程序的關系如下圖

    Web架構:varnish緩存代理服務器超詳細剖析

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

   2) vcl_recv調用 hash函數時

     進入該狀態后,會通過vcl_hash子程序,根據請求的url或其他信息生成hash鍵值,

     然后查找hash鍵值相同的緩存數據,若找到,則進入val_hit狀態,否則進入vcl_miss狀態

     Web架構:varnish緩存代理服務器超詳細剖析

   3) vcl_recv調用pass 函數時

  • vcl_recv調用pass 函數時,pass將當前請求直接轉發到后端服務器。而后續的請求仍然通過varnish處理。

  • pass varnish)通常只處理靜態頁面。即只在GET  HEAD 類型的請求中時才適合調用pass函數。另外,需要注意的一點是,pass模式不能處理POST請求,為什么呢?因為POST請求一般是發送數據給服務器,需要服務器接收數據,并處理數據,反饋數據。是動態的,不作緩存

     Web架構:varnish緩存代理服務器超詳細剖析

   4) vcl_recv判斷需要調用 pipe 函數時

  • vcl_recv判斷需要調用 pipe 函數時,varnish會在客戶端和服務器之間建立一條直接的連接,之后客戶端的所有請求都直接發送給服務器,繞過varnish,不再由varnish檢查請求,直到連接斷開。

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

    Web架構:varnish緩存代理服務器超詳細剖析

   5) vcl_recv指定purge模式時

      Purge模式用于清除緩存

  5. 優雅模式garce mode

1) 請求合并

  • 當幾個客戶端請求同一個頁面的時候,varnish只發送一個請求到后端服務器,然后讓其他幾個請求掛起并等待返回結果

2) 問題

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

3) 解決問題

  • 配置varnish在緩存對象因超時失效后再保留一段時間,以給那些等待的請求返回過去的文件內容(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分鐘的過期內容
     }
     else {                            如果健康
       set req.grace = 15s;varnish向前段提供15秒的過期內容
     }
   }
 
   sub vcl_fetch {
       set beresp.grace = 30m;將失效的緩存對象再多保留30分鐘
   }

三、 varnish的安裝

  1. 下載varnish壓縮包

    有兩個地方可下載

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

     但是有時候varnish的官網會被墻

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

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

  2. Varnish的安裝

     首先安裝依賴包

     Web架構:varnish緩存代理服務器超詳細剖析

     配置varnish

     Web架構:varnish緩存代理服務器超詳細剖析

     編譯并安裝

     Web架構:varnish緩存代理服務器超詳細剖析

     拷貝vcl文件

     Web架構:varnish緩存代理服務器超詳細剖析

     官方提供的vcl配置文件沒有提示太多的配置信息,在生產環境中還是需要自己進行配置

四、 Varnish VCL實例配置解析

  拓撲環境

   Web架構:varnish緩存代理服務器超詳細剖析

五、 啟動varnish

   Web架構:varnish緩存代理服務器超詳細剖析

六、 varnish vcl配置解析

   Varnish有自己的編程語法vclvarnish啟動時,會將配置文件編譯為C語言,然后再執行

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

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

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

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


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

   2)   監視器定義

     Web架構:varnish緩存代理服務器超詳細剖析

     Web架構:varnish緩存代理服務器超詳細剖析

1
2
3
4
5
6
7
8


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

   3)   負載均衡群集directors

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

  • Directors負載均衡支持的算法:

      使用randomhash 必須配置權重值,用于提高隨機率

      Web架構:varnish緩存代理服務器超詳細剖析

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;
  
    配置后端服務器
    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 {           
    調用vcl_init初始化子程序創建后端主機組,即directors
        new  web_cluster =directors.round_robin();
        使用new關鍵字創建drector對象,使用round_robin算法
        web_cluster.add_backend(web1);
        添加后端服務器節點
        web_cluster.add_backend(web2);
    }
    
    開始處理請求
    sub vcl_recv {
    調用vcl_recv子程序,用于接收和處理請求
        set req.backend_hint = web_cluster.backend();
        選取后端
    }

說明:

  • set命令是設置變量

  • unset命令是刪除變量

  • web_cluster.add_backend(backend , real );  添加后端服務器節點,backend 為后端配置別名,real 為權重值,隨機率計算公式:100 * (當前權重 / 總權重)

  • req.backend_hintvarnish的預定義變量,作用是指定請求后端節點

  • vcl對象需要使用new關鍵字創建,所有可創建對象都是內定的,使用前必需import,所有new操作只能在vcl_init子程序中。

  2. 訪問控制列表(acl

  • 創建一個地址列表,用于后面的判斷

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

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

      Web架構:varnish緩存代理服務器超詳細剖析

  3. 緩存規則設置

Web架構:varnish緩存代理服務器超詳細剖析

    說明:

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

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

      Web架構:varnish緩存代理服務器超詳細剖析

       修改框中的變量,指定為varnish中設置的變量

七、 varnish將不同的url發送到不同的后端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;
}
定義后端服務器web1和web2


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



//初始化處理
sub vcl_init {            
//調用vcl_init初始化子程序創建后端主機組,即directors
    new  web_cluster = directors.round_robin()
    //使用new關鍵字創建drector對象,使用round_robin算法
      web_cluster.add_backend(web1);
      //添加后端服務器節點
      web_cluster.add_backend(web2);
    new img_cluster = directors.random();
    //創建第二個集群
      img_cluster.add_backend(img1,2)
      添加后端服務器節點,并且設置權重值
      img_cluster.add_backend(img2,5);
}


//根據不同的訪問域名,分發至不同的后端主機組
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)表示關閉忽略大小寫


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临沧市| 松滋市| 和平县| 冕宁县| 钦州市| 准格尔旗| 林州市| 综艺| 拉萨市| 伊川县| 英超| 盐源县| 鄂伦春自治旗| 沁源县| 龙川县| 吉木乃县| 贡觉县| 锡林浩特市| 天津市| 桐庐县| 曲阜市| 政和县| 武夷山市| 大足县| 西安市| 皮山县| 宽城| 共和县| 安顺市| 昭平县| 南漳县| 华安县| 同江市| 万全县| 绥德县| 东明县| 阜新市| 昌都县| 红安县| 鄂温| 长沙县|