Varnish工作原理及配置詳解

1.基本概念

     在當前主流的Web架構中,Cache擔任着越來越重要的作用。常見的基於瀏覽器的C/S架構,Web Cache更是節約服務器資源的關鍵。而最近幾年由FreeBSD創始人之一Kamp開發的varnish更是一個不可多得的Web Cache Server。嚴格意義上說,Varnish是一個高性能的反向代理軟件,只不過與其出色的緩存功能相比,企業更願意使用其搭建緩存服務器。同時,由於其工作在Web Server的前端,有一部分企業已經在生產環境中使用其作爲舊版本的squid的替代方案,以在相同的服務器成本下提供更好的緩存效果,Varnish更是作爲CDN緩存服務器的可選服務之一。

    

根據官網的介紹,Varnish的主要特性如下:https://www.varnish-cache.org/

        1.緩存位置:可以使用內存也可以使用磁盤。如果要使用磁盤的話推薦SSDRAID1

        2.日誌存儲:日誌也存儲在內存中。存儲策略:固定大小,循環使用

        3.支持虛擬內存的使用。

        4.有精確的時間管理機制,即緩存的時間屬性控制。

        5.狀態引擎架構:在不同的引擎上完成對不同的緩存和代理數據進行處理。可以通過特定的配置語言設計不同的控制語句,以決定數據在不同位置以不同方式緩存。類似於netfilter中的鉤子,在特定的地方對經過的報文進行特定規則的處理。

        6.緩存管理:以二叉堆格式管理緩存數據,做到數據的及時清理。

 

2.簡單架構

    Management進程:對子進程進行管理,同時對VCL配置進行編譯,並應用到不同的狀態引擎。

    Child進程:生成線程池,負責對用戶請求進行處理,並通過hash查找返回用戶結果。

    wKioL1Qe667iERLeAAERfZzjdp0689.jpg


3.狀態引擎

      每一個狀態引擎處理結束之後,都會將結果returnvarnish,由varnish決定下一個狀態引擎。由於每個引擎的下一個處理引擎都是特定的,所以return的值基本上也是確定的,可以通過官方文檔獲取。各引擎的處理流程圖如下:

    wKiom1Qe7A7DjFuNAAFeXnOTfQA147.jpg


vcl_recv : 接收用戶請求,判斷是否是可緩存數據。
    vcl_pipe :不可緩存數據,直接管道後端處理
    vcl_hash :可緩存數據,通過hash機制處理,默認url做key;也可以自定義區分客戶端是否支持處理壓縮數據而判斷區分緩存。
        vcl_hit : 命中          
        vcl_miss :未命中          vcl_fetch : 後端取數據
             vcl_pass :給命中或者未命中的數據提供一個特殊位置以對請求的數據進行特殊處理
vcl_deliver: 1.hit直接deliver; 2.fetch直接deliver



4.內部處理流程

        wKiom1Qe7IbRRHkVAAINQZRar-k711.jpg


5.簡單安裝

     可以直接去官網下載需要的版本: https://www.varnish-cache.org/installation/redhat

[root@node30 ~]# wget  https://repo.varnish-cache.org/redhat/varnish-3.0.el6.rpm
[root@node30 ~]# rpm -ivh varnish-3.0.el6.rpm
[root@node30 ~]# cat /etc/yum.repos.d/varnish.repo
    [varnish-3.0]
    name=Varnish 3.0 for Enterprise Linux el6 - $basearch
    baseurl=http://repo.varnish-cache.org/redhat/varnish-3.0/el6/$basearch
    enabled=1
    gpgcheck=0
    #gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-VARNISH
[root@node30 ~]# yum install varnish
    Downloading Packages:
    (1/2): varnish-3.0.5-1.el6.x86_64.rpm                  |   444 kB       00:10    
    (2/2): varnish-libs-3.0.5-1.el6.x86_64.rpm             |   42 kB        00:01    
[root@node30 ~]# service varnish start

 

6.配置文件

 #vim /etc/sysconfig/varnish
    NFILES=131072           #最大打開文件數65536*2
    MEMLOCK=82000           #默認日誌文件大小,單位kB
    NPROCS="unlimited"      #最大線程數量
    RELOAD_VCL=1            #設置爲1可以使用reload代替restart加載vcl
     
    ## Alternative 1 Minimal configuration, no VCL
    #DAEMON_OPTS="-a :6081 \
    #             -T localhost:6082 \
    #             -b localhost:8080 \
    #             -u varnish -g varnish \
    #             -s file,/var/lib/varnish/varnish_storage.bin,1G"
     
    ## Alternative 2, Configuration with VCL
    #DAEMON_OPTS="-a :6081 \
    #             -T localhost:6082 \
    #             -f /etc/varnish/default.vcl \
    #             -u varnish -g varnish \
    #             -S /etc/varnish/secret \
    #             -s file,/var/lib/varnish/varnish_storage.bin,1G"
     
    ## Alternative 3, Advanced configuration
    VARNISH_VCL_CONF=/etc/varnish/default.vcl   # 定義vcl配置文件
    # VARNISH_LISTEN_ADDRESS=                   # 定義varnish服務監聽地址
    VARNISH_LISTEN_PORT=6081                    # 定義varnish服務監聽端口
    VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1      # 定義允許進行進程管理地址
    VARNISH_ADMIN_LISTEN_PORT=6082              # 定義管理進程監聽端口
    VARNISH_SECRET_FILE=/etc/varnish/secret     # 定義密碼文件
    VARNISH_MIN_THREADS=50                      # 定義varnish啓動時最小線程數
    VARNISH_MAX_THREADS=1000                    # 定義varnish啓動時最大線程數
    VARNISH_THREAD_TIMEOUT=120                  # 定義varnish線程響應超時時間
     
    VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin  # 定義varnish文件存儲地址
    VARNISH_STORAGE_SIZE=1G                     # 定義緩存使用文件大小,單位:k/M/G/T
    # VARNISH_MEMORY_SIZE=64M                   # 定義緩存使用內存大小
    
    VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"# 使用文件緩存
    VARNISH_STORAGE="malloc,${VARNISH_MEMORY_FILE}"                       # 使用內存緩存             
    VARNISH_TTL=120                             # 設置後端超時時間
    DAEMON_OPTS="-a  ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \   # 變量調用
            -f ${VARNISH_VCL_CONF} \
            -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
            -t ${VARNISH_TTL} \
            -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
            -u varnish -g varnish \
            -S ${VARNISH_SECRET_FILE} \
            -s ${VARNISH_STORAGE}"

 

7.簡單設置(反向代理配置)

vim /etc/varnish/default.vcl
    backend default {
        .host = "192.168.1.10";
        .port = "80";
    }

 

8.簡單管理工具

# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
    varnish> ping
    varnish> vcl.load d1 /etc/varnish/default.vcl
    varnish> vcl.list
    varnish> vcl.use d1
    varnish> vcl.list
    varnish> backend.list
    varnish> storage.list

 

9.訪問測試

     發現已經請求到後端httpd服務器上的內容了,今天就介紹到這兒。關於VCL詳細的配置說明在下一篇博客中記錄。

wKiom1Qe7tzjfBH7AAO9fGLRE_w473.jpg



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