varnish及其應用(一)

一、什麼是varnish

 

       Varnish 是一款高性能且開源的反向代理服務器和 HTTP 加速器,其採用全新的軟件體系機構,和現在的硬件體系緊密配合,與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點。

       Varnish 與一般服務器軟件類似,分爲 master 進程和 child 進程。Master 進程讀入存儲配置文件,調用合適的存儲類型,然後創建 / 讀入相應大小的緩存文件,接着 master 初始化管理該存儲空間的結構體,然後 fork 並監控 child 進程。Child 進程在主線程的初始化的過程中,將前面打開的存儲文件整個 mmap 到內存中,此時創建並初始化空閒結構體,掛到存儲管理結構體,以待分配。Child 進程分配若干線程進行工作,主要包括一些管理線程和很多 worker 線程。

       接着,開始真正的工作,varnish 的某個負責接收新 HTTP 連接線程開始等待用戶,如果有新的 HTTP 連接過來,它總負責接收,然後喚醒某個等待中的線程,並把具體的處理過程交給它。Worker 線程讀入 HTTP 請求的 URI,查找已有的 object,如果命中則直接返回並回複用戶。如果沒有命中,則需要將所請求的內容,從後端服務器中取過來,存到緩存中,然後再回復。

       分配緩存的過程是這樣的:它根據所讀到 object 的大小,創建相應大小的緩存文件。爲了讀寫方便,程序會把每個 object 的大小變爲最接近其大小的內存頁面倍數。然後從現有的空閒存儲結構體中查找,找到最合適的大小的空閒存儲塊,分配給它。如果空閒塊沒有用完,就把多餘的內 存另外組成一個空閒存儲塊,掛到管理結構體上。如果緩存已滿,就根據 LRU 機制,把最舊的 object 釋放掉。

       釋放緩存的過程是這樣的:有一個超時線程,檢測緩存中所有 object 的生存期,如果超初設定的 TTL(Time To Live)沒有被訪問,就刪除之,並且釋放相應的結構體及存儲內存。注意釋放時會檢查該存儲內存塊前面或後面的空閒內存塊,如果前面或後面的空閒內存和該 釋放內存是連續的,就將它們合併成更大一塊內存。

       整個文件緩存的管理,沒有考慮文件與內存的關係,實際上是將所有的 object 都考慮是在內存中,如果系統內存不足,系統會自動將其換到 swap 空間,而不需要 varnish 程序去控制。

 

二、varnish結構

 

wKioL1V0OLawf2tOAAE0eBrhUNc968.jpg

 

(一)、兩種進程:

 

     ① management主進程

         編譯VCL並應用新配置、監控varnish(如果發現某個子進程不正常或不在工作,則會重啓該進程)、初始化varnish,並提供一個CLI;

         三個管理接口:

            cli if

            telnet if

            web if :收費

     ② Child/Cache線程,有下面幾類:

           Acceptor:接收新的連接請求;

           Worker:用於處理並響應用戶請求;

           Expiry:從緩存中清理過期cache object

 

(二)日誌:

 

         logfile:在內存中找一段固定大小的片段記錄,滿後就從頭開始記錄,因此如果需要永久保存就需要定期導出。

        malloc:使用 shared memry log,工作於內存中,性能優越,共享內存日誌,日誌大小一般90M(與版本有關):分兩部分——前一部分爲計數器,後一部分爲客戶請求相關的數據;

 

(三)11種狀態引擎state engine:

 

       vcl配置的緩存策略在這些state engine中發揮作用,state engine之間有相關性,上級engine通過return指明下級engine;如果子程序中沒有設定或者後續引擎沒有指定,則控制器會採用默認設置;

         vcl的配置語法:

             (1) //, #, /*comment*/用於註釋;

             (2) sub $NAME 用於定義函數(不支持參數,更像過程,執行完就沒了);

             (3) 不支持循環;

             (4) 有衆多內置變量;

             (5) 支持終止語句(return),沒有返回值;

             (6) “域”專用語言(代碼必須寫在特定相關域中);

             (7) 操作符:  =(賦值),==(比較),~(模式匹配),!(取反),&&(邏輯與),||(邏輯或)

①vcl_recv

          請求被接入,但在其被分析、處理之前調用,目的是 決定是否服務此請求、如何處服務、使用哪個後端服務器響應。

          結束時可用 returm()關鍵字:

          error code[reason]

                返回特定的錯誤碼給客戶端,然後丟棄此請求

          pass

                 調用vcl_pass引擎,切換到pass模式

          pipe

                切換至pipe模式,最終是交給vcl_pipe處理

          lookup

                交換給hash查找緩存對象

②vcl_pipe:

           varnish緩存服務器直接將客戶端請求交給後端服務器處理,自己不任何處理,後端服務器的響應也是不做處理直接給客戶端,此客戶端的後續數據報文也做此處理,直到客戶端或者後端服務器中任何一方斷開連接爲止。

          結束時可用 returm()關鍵字:

          error code [reason]

                返回特定的錯誤碼給客戶端,然後丟棄此請求

          pipe

                交給pipe模式處理

③vcl_pass:

           將客戶端請求傳送給後端服務器,後端服務器響應的報文不存入緩存而傳給客戶端

          通過下面的returm()關鍵字結束vcl_pass:

          error code [reason]

               返回特定的錯誤碼給客戶端,然後丟棄此請求

          pass

                調用vcl_pass引擎,切換到pass模式

④vcl_hash:調用hash_data()查找緩存

          通過調用returm(hash)繼續進行下一步

⑤vcl_hit:

         當在緩存中成功找到時調用

          通過調用下面的returm()來結束:

          deliver

                切換至vcl_deliver引擎,將找到的內容發送給客戶

          error code [reason]

                返回特定的錯誤碼給客戶端,然後丟棄此請求

          pass

                調用vcl_pass引擎,切換到pass模式

          restart

                重啓會話,這會增加restart計數器的值,當該值大於max_restarts ,varnish會報錯並終止會話

 ⑥vcl_miss:

         當在緩存中沒有找到對應的對象時調用;在此域中設置是否要到後端服務器去取數據,及使用哪臺後端服務器

          通過調用下面的returm()來結束:

          error code [reason]

                返回特定的錯誤碼給客戶端,然後丟棄此請求

          pass

                調用vcl_pass引擎,切換到pass模式

          fetch

                調用 vcl_fetch引擎到後端服務器去數據

⑦vcl_fetch:

          當成功從後端服務器取到數據時調用

          通過調用下面的returm()來結束:

          deliver

                切換至vcl_deliver引擎,將找到的內容發送給客戶

          error code [reason]

                返回特定的錯誤碼給客戶端,然後丟棄此請求

          hit_for_pass

                pass此模式,產生一個hit_for_pass object

          restart

                重啓會話,這會增加restart計數器的值,當該值大於max_restarts ,varnish會報錯並終止會話

⑧vcl_delier:

         在構建響應報文返回給客戶端時調用

          通過調用下面的returm()來結束:

          deliver

                切換至vcl_deliver引擎,將找到的內容發送給客戶

          restart

                重啓會話,這會增加restart計數器的值,當該值大於max_restarts ,varnish會報錯並終止會話

⑨vcl_error:

         當發生錯誤時調用;錯誤無論大小,無論是varnish引擎自己產生的還是後端服務器的錯誤

          通過調用下面的returm()來結束:

          deliver

                切換至vcl_deliver引擎,將找到的內容發送給客戶

          restart

                重啓會話,這會增加restart計數器的值,當該值大於max_restarts ,varnish會報錯並終止會話

⑩vcl_init:

         初始化引擎,當vcl剛裝載還沒有任何請求被通過時使用,裝載不同的模塊(VMODS)時使用

          可使用的returm()值

          ok

                正常返回,繼續裝載其他引擎

 vcl_fini:

          僅在處理完所有請求後需要丟棄某個vcl策略時調用

          通過調用下面的returm()來結束:

           ok

                 正常返回,不調用其他引起,vcl策略將被刪除

 

 

 

 

三、安裝varnish及生成文件相關說明

    在教室環境中lftp下載程序包並安裝:

lftp 172.16.0.1:/pub/Sources/6.x86_64> cd varnish/
lftp 172.16.0.1:/pub/Sources/6.x86_64/varnish> ls
drwxr-xr-x    2 0        0            4096 Jan 07 09:18 3.0.4
drwxr-xr-x    2 500      500          4096 Sep 24  2014 3.0.5
-rw-r--r--    1 0        0          454496 Oct 21  2014 varnish-3.0.6-1.el6.x86_64.rpm
-rw-r--r--    1 0        0          360284 Oct 21  2014 varnish-docs-3.0.6-1.el6.x86_64.rpm
-rw-r--r--    1 0        0           42620 Oct 21  2014 varnish-libs-3.0.6-1.el6.x86_64.rpm
-rw-r--r--    1 0        0           23992 Oct 21  2014 varnish-libs-devel-3.0.6-1.el6.x86_64.rpm
lftp 172.16.0.1:/pub/Sources/6.x86_64/varnish> mget *.rpm



# rpm -ivh varnish-libs-3.0.6-1.el6.x86_64.rpm varnish-3.0.6-1.el6.x86_64.rpm varnish-docs-3.0.6-1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:varnish-libs           ########################################### [ 33%]
   2:varnish                ########################################### [ 67%]
   3:varnish-docs           ########################################### [100%]


 生成文件相關說明:

[root@aunt-s ~]# rpm -pql varnish-3.0.6-1.el6.x86_64.rpm 
/etc/logrotate.d/varnish   ——設定日誌滾動記錄的腳本
/etc/rc.d/init.d/varnish ——varnish程序服務腳本
/etc/rc.d/init.d/varnishlog ——控制varnish日誌守護進程服務腳本
/etc/rc.d/init.d/varnishncsa ——控制varnish NCSA日誌記錄守護進程服務腳本
上面兩種日誌都是從共享內存日誌中抽取數據永久記錄日誌的,只是記錄的格式不同,啓動其中一個即可。
/etc/sysconfig/varnish ——配置varnish自己的工作特性(如監聽地址和端口),通過向/etc/rc.d/init.d/varnish傳遞參數配置實現的。
/etc/varnish
/etc/varnish/default.vcl ——配置緩存策略文件
/usr/bin/varnish_reload_vcl
/usr/bin/varnishadm ——varnish的CLI
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib64/varnish
/usr/lib64/varnish/libvarnish.so
/usr/lib64/varnish/libvarnishcompat.so
/usr/lib64/varnish/libvcl.so
/usr/lib64/varnish/libvgz.so
/usr/lib64/varnish/vmods
/usr/lib64/varnish/vmods/libvmod_std.so
/usr/sbin/varnishd ——varnish主程序
/usr/share/doc/varnish-3.0.6
/usr/share/doc/varnish-3.0.6/ChangeLog
/usr/share/doc/varnish-3.0.6/LICENSE
/usr/share/doc/varnish-3.0.6/README
/usr/share/doc/varnish-3.0.6/README.redhat
/usr/share/doc/varnish-3.0.6/examples
/usr/share/doc/varnish-3.0.6/examples/default.vcl
/usr/share/doc/varnish-3.0.6/examples/zope-plone.vcl
/usr/share/man/man1/varnishadm.1.gz
/usr/share/man/man1/varnishd.1.gz
/usr/share/man/man1/varnishhist.1.gz
/usr/share/man/man1/varnishlog.1.gz
/usr/share/man/man1/varnishncsa.1.gz
/usr/share/man/man1/varnishreplay.1.gz
/usr/share/man/man1/varnishsizes.1.gz
/usr/share/man/man1/varnishstat.1.gz
/usr/share/man/man1/varnishtest.1.gz
/usr/share/man/man1/varnishtop.1.gz
/usr/share/man/man3/vmod_std.3.gz
/usr/share/man/man7/varnish-cli.7.gz
/usr/share/man/man7/varnish-counters.7.gz
/usr/share/man/man7/vcl.7.gz
/var/lib/varnish
/var/log/varnish ——日誌記錄目錄

 

varnish-docs-3.0.6-1.el6.x86_64.rpm此程序包提供varnish幫助文檔,文件格式是html,不是必須安裝程序。

 

四、CLI管理工具

(一)varnishadm

定義varnish工作特性的命令:

varnishd

格式:

varnishd [-a address[:port]] [-b host[:port]] [-d] [-F] [-f config]

 

option:

 1-a address[:port][,address[:port][...]

監聽的地址和端口,地址可以是主機名(如“localhost”)、IPv4地址(如“127.0.0.1”)、IPv6地址(如“[::1]”),未指定則監聽所有可用的IP地址

端口未指定則監聽/etc/services 文件指定的HTTP服務端口(一般是80)

2-b host[:port]

          指定後端服務器及端口。如果端口未指定,則默認是8080.一般在配置文件中做精細指定,而不在這指定。

3-C

直接顯示vcl編譯後的代碼轉換爲C語言,然後退出。

4-d     

打開調試模式:主進程通過CLI接口運行於前臺,子進程須通過CLI命令啓動,關閉主進程也會終止子進程

5-F

讓守護進程運行於前臺

6 -f config

通過指定的VCL配置文件傳遞規則給varnish守護進程,以代替默認的內置規則。如果沒有設置配置參數,varnish進程不會啓動。

7-g group

指定子進程以什麼組身份運行的

     8-h type[,options]

指明hash算法,可以指定的 hash算法類型:

  simple_list

指明一個簡單的雙鏈表,自左而右支持多種。不推薦生產使用 

   classic[,buckets]

標準hash表,默認選項。hash的鍵是對目標url做hash得到的。buckets是指定進入hash表的入口數,默認是16383.

 critbit

         很少用。自我縮放的樹結構hash算法

9-i identity

指明varnish服務器標識符,意義不大

10-l shmlogsize

指明共享內存日誌文件大小,默認80MB(版本不一樣,默認大小可能不同),小於8MB是不明智的

 

11-n name

指明進程名字,保存進程臨時文件和持續狀態時的路徑會使用此名字。名字如果以“/”開頭,則是使用絕對路徑創建文件  

12-P file

指名pid文件              Write the process's PID to the specified file.

 

13-p param=value

指定參數值  

14       -S file

指定授權進入管理端口的密鑰文件              Path to a file containing a secret used for authorizing access to the management port.

15-s [name=]type[,options]

使用制定的存儲後端(是內存還是單個文件)。存儲後端可以指定多個,記錄日誌及統計信息時也以此後端爲標籤。  

可用的存儲類型Storage Types

 malloc[,size]

這表面在內存中緩存,size指明使用緩存的最大值,單位爲字節,可用K、k、M、m、G、g、T、t單位。如果未給定size,則沒有上限。

       file[,path[,size[,granularity]]]

使用單個文件構建緩存,所有緩存對象都存儲在這個文件中,存儲類型的默認選項。

path指明該文件的路徑(默認是/tmp),size指明大小,默認爲字節,可用K、k、M、m、G、g、T、t單位  ,也可用%指明使用所在分區的空閒空間的百分比,默認是50%

 persistent,path,size {experimental}

實驗型存儲類型,生產中莫用。存儲對象存儲於單個文件中,進程重啓後不會消失。           path指明該文件路徑,,size指明大小,單位爲字節,可用K、k、M、m、G、g、T、t單位。

            

16-T address[:port]

指定管理接口的監聽地址和端口,端口默認是6082  

17-t ttl 

指定緩存文件的ttl值(time to live)

18 -w min[,max[,timeout]]

指定啓動時的最少及最大子進程數、空閒進程的超時時長。 這個是指定 thread_pool_min,  thread_pool_maxthread_pool_timeout實時參數值的捷徑。如果只給定了一個數值,則表示min和max都是這個值,且timeout是無效的。

 

 

 

 51cto抽風

 


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