天天看點

varnish 簡介以及實用配置

若是有對以下的配置指令有不明晰的,附件有在下翻譯的VCL手冊,可以進行查閱!

1. 什麼是varnish?

   1、varnish首先是一個反向代理伺服器,其次才是一個web加速緩存伺服器。它所緩存的對象是key/value(即鍵/值)的形式來存儲的,通常情況下,鍵一般是指URL,而值就是URL問的具體的資源(或稱為對象)。

   2、varnish的配置檔案是由專門的VCL(即varnish 配置語言)來進行配置的。這種語言首先要先轉換為C代碼,然後在執行。

   3、varnish支援epoll、kqueue等這種高性能的I/O事件通知模型。

   4、 varnish的日志在它所申請的共享記憶體日志中。預設為80M,

2. varnish的原理

   1、varnish啟動後包含兩個程序,一個是management程序和child程序。

   2、management程序主要用來管理配置檔案以及對子程序的監控和對varnish的初始化,而且提供了一個指令行管理接口等。

   3、child程序由幾個不同類型的線程組成,比較典型的有:

       ● acceptor線程:用來接收新連接配接

       ● worker線程:具體工作的線程,一個線程對應一個連接配接會話。

       ● expiry線程:對過期的線程程序清除。

3. varnish支援的緩存存儲類型:

       ● file:使用特定的檔案存儲所有的緩存資料,然後在通過mmap()這個系統調用将整個檔案的資料映射到程序空間。不過,重新開機或停止varnish後,緩存的内容會消失,也就是說不能持久存儲。

       ● malloc:使用malloc()系統調用在varnish啟動的時候想記憶體申請固定大小的記憶體來緩存資料。

       ● persistent:還處于測試時期,不建議使用。

       注:存儲類型使用-s參數來指定。

4. 安裝與配置

   環境:CentOS6.5,iptables 和 selinux 為關閉狀态。

   軟體包:varnish-3.0.5-1.el6.x86_64.rpm

           varnish-docs-3.0.5-1.el6.x86_64.rpm

           varnish-libs-3.0.5-1.el6.x86_64.rpm

   下載下傳位址:

       http://repo.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnish/

   前端:varnish伺服器,兩塊網卡:

       eth0: 172.16.0.11

       eth1: 192.168.0.11

   後端:兩台apache伺服器,各一塊網卡:

       web1: 192.168.0.12

       web2: 192.168.0.13

       網關:192.168.0.11

配置檔案:

       目錄:/etc/varnish

       檔案:default.vcl

             secret #用于管理接口所使用的共享密鑰檔案

       腳本:/etc/rc.d/init.d/varnishd

       腳本配置檔案:/etc/sysconfig/varnish #用于指定配置參數

           其中:-a <[hostname]:port> : 指定varnish服務監聽的位址和端口

                 -f <filename> : 指定VCL檔案路徑

                 -p <parameter=value> : 用于調整參數值

                 -S <secretfile> : 指令行管理接口的認證加密檔案

                 -T <hostname:port> : 指定管理的位址和接口

                 -s <storagetype,options> : 指定緩存對象的存儲類型和位置,以及大小等

負載均衡支援的算法:

       ● round-robin : 沒有額外的參數

       ● random :包含有兩個參數:

           1、.weight :表示權重越大,對應的後端伺服器接收的請求越多,可以對每個後端伺服器進行設定。

           2、.retries : 用于定義查找後端健康伺服器的次數。是對整個director進行設定的,其預設值為在director中定義的伺服器的數量。

       ● hash :它是random的一個特殊變體,它使用緩存中的hash資料來進行排程,也就是說相同的URL的請求将會發往相同的web伺服器。這種排程方法非常适合後端伺服器還是緩存伺服器的情況。

       ● client :它也是random的一個特殊變體。它使用client.identity來進行排程,此變量預設值是用戶端的IP,但是可以在VCL中改變其值。使用這種算法,如果所有 請求的client.identity的值相同的話,那麼統一用戶端的請求都會發往同一個後端伺服器。

       ● dns :它是根據用戶端請求Host頭部資訊,在一個給定的後端伺服器清單中進行查找 比對的。(此算法用的不多,也不支援對後端服務的健康檢測)

       ● fallback : 用來定義備用伺服器,沒有額外的參數。

       注意:先定義後調用,有先後順序之分,隻定義不調用會報錯。比如,在定義director後必須在後面對其進行調用否則會發生編譯錯誤。

1、将varnish的監聽接口改為80

       vim /etc/sysconfig/varnish

           VARNISH_LISTEN_PORT=80

2、定義後端伺服器

       backend web1 {

           .host = "192.168.0.12";

           .port = "80";

       }

       backend web2 {

           .host = "192.168.0.13";

3、定義負載均衡director(即排程器)

       director webs round-robbin {

           { .backend = web1; }

           { .backend = web2; }

4、調用上面定義的director

       sub vcl_recv {

           set req.backend = webs;

           return(pass); #測試的時候把預設配置的return(lookup)改為return(pass),否 則,後續的請求就直接去查找緩存了,看不出測試效果。

 5、定義對後端進行健康狀态的檢測,需要在backend區段的上面,并在backend區段進行引用

       probe healthchk {

           .url = "/";

           .interval = 3s;

           .timeout = 10ms

           .window = 3;

           .threshold = 2;

           .initial = 3;

           .expected_response = 200;

           .probe = healthchk;

           .probe = hearlthchk;

   6、定義動靜分離,假定web1提供動态内容,web2提供靜态記憶體,不過要先把director端注釋掉

           if (req.url ~ "(?i)\.php$") {

               set req.backend = web1;

           } else {

               set req.backend = web2;

           }

       sub vcl_fetch {

           set beresp.http.From-Backend = beresp.backend.ip; #用于測試是否動靜個來自對應的伺服器

7、定義反盜鍊功能

           if (req.http.referer ~ "http://.*") {

           if ( !(req.http.referer ~ "http://.*\.google\.com" ||

                  req.http.referer ~ "http://.*\.baidu\.com" ||

                  req.http.referer ~ "http://.*\.myselfsite\.com"))

           {

               set req.http.host = "www.myselfsite.com";

               set req.url = "/login/login.html";

   }

8、如何知道緩存是否命中,以及命中的次數

       sub vcl_deliver {

           if (obj.hits > 0) {

               set resp.http.X-Varnish-Cache = "HIT";

               set resp.http.X-Cache-Hits = obj.hits;

               set resp.http.X-Varnish-Cache = "MISS";

9、去掉對靜态檔案請求時所帶的Cookie資訊,可以提供緩存命中率

           if (req.url ~ "(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$") {

               unset req.http.Cookie;

               unset beres.backend.set-cookie;

  10、手動清除過期的緩存

       acl purgers {

           "127.0.0.1";

           "192.168.0.0"/24;

           if (req.request == "PURGE") {

               if (!client.ip ~ purgers) {

                   error 405 "Method not allowed";

               }

               return (lookup);

       sub vcl_hit {

               purge;

               error 200 "Purged";

       sub vcl_miss {

               error 404 "Not in cache";

       sub vcl_pass {

               error 502 "PURGE on a passed object";

繼續閱讀