1. 程式人生 > >web緩存服務器varnish-4.1.6的部署及配置詳解

web緩存服務器varnish-4.1.6的部署及配置詳解

是否 次數 tool 至少 hits 檢查 rep nat list

web緩存服務器varnish-4.1.6的部署及配置詳解


1.安裝varnish4.1.6
安裝依賴

yum install -y autoconf automake jemalloc-devel libedit-devel libtool ncurses-devel pcre-devel pkgconfig python-docutils python-sphinx

安裝varnish yum倉庫

# rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.1.el7.rpm 
# yum install varnish -y

2.設置Varnish參數

# grep "^[a-Z]" /etc/varnish/varnish.params 
RELOAD_VCL=1    # 重新啟動服務時是否重新讀取VCL並重新編譯
VARNISH_VCL_CONF=/etc/varnish/default.vcl    # 默認讀取的VCL文件
VARNISH_LISTEN_PORT=80    # 設置監聽的端口(默認監聽6081端口)
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1    # 管理接口監聽的地址
VARNISH_ADMIN_LISTEN_PORT=6082    # 管理接口監聽的端口
VARNISH_SECRET_FILE
=/etc/varnish/secret # 使用的密鑰文件 VARNISH_STORAGE="malloc,256M" # 存儲文件的大小 VARNISH_USER=varnish # varnish默認用戶 VARNISH_GROUP=varnish # varnish默認組

定義VCL backend

# cat /etc/varnish/default.vcl |grep -v "#"

vcl 4.0;

backend web01 {
    .host = "192.168.3.12";
    .port = "80";
}

啟動varnish
# systemctl start varnish
# systemctl enable varnish

技術分享

3.定義VCL 後端的集合 director
VCL 可以把多個 backends 聚合成一個組,這些組被叫做 director,這樣可以增強性能和彈力,當組裏一個 backend 掛掉後,可以選擇另一個健康的 backend。VCL 有多種 director,不同的 director 采用不同的算法選擇 backend,主要有以下幾種:
a. The random director
Random director 會根據所設置的權值(weight)來選擇 backend,.retries 參數表示嘗試找到一個 backend 的最大次數,.weight 參數表示權值
b. The round-robin director
Round-robin director 在選擇 backend 時,會采用循環的方式依次選擇。
c. The client director
Client director 根據 client.identity 來選擇 backend,您可以設置 client.identity 的值為 session cookie 來標識 backend。

# vim /etc/varnish/default.vcl
vcl 4.0;                    # 指明varnish版本                        
backend web01 {                    # 定義後端服務器1
    .host = "192.168.3.12";
    .port = "80";
}

backend web02 {                    # 定義後端服務器2
    .host = "192.168.3.13";
    .port = "80";
}

import directors;                # 定義directors
sub vcl_init {                    # 定義vcl_init子例程
        new cluster1 = directors.round_robin();
        cluster1.add_backend(web01);
        cluster1.add_backend(web02);
}

sub vcl_recv {                    # 定義vcl_recv子例程
        set req.backend_hint = cluster1.backend(); #指定後端directors
}

詳情:https://www.varnish-cache.org/docs/4.1/reference/vmod_directors.generated.html#object-hash

4.設置響應是否命中

sub vcl_deliver {                   # 定義子例程
        if (obj.hits > 0) {      
                set resp.http.X-Cache = "HIT via" + " " + server.ip;
        } else {
                set resp.http.X-Cache = "MISS via" + " " + server.ip;
        }             # 判斷如果命中就在http響應首部設置X-Cache為HIT,否則就在http響應首部設置X-Cache為MISS。
}

然後再到頁面上訪問看一下是否已經生效,可以看到第一次訪問的時候是MISS第二次的時候就是HIT了

技術分享


5.指定某些文件不能查緩存

sub vcl_recv {
        if (req.url ~ "^/test.html$") {
                return(pass);
        }            ##定義請求的文件中如果匹配test.html就pass,不查緩存
}

通過測試可以看到連續訪問http://192.168.3.198/test.html都是MISS

技術分享

6.進行健康檢查
Varnish可以檢測後端主機的健康狀態,在判定後端主機失效時能自動將其從可用後端主機列表中移除,而一旦其重新變得可用還可以自動將其設定為可用。為了避免誤判,Varnish在探測後端主機的健康狀態發生轉變時(比如某次探測時某後端主機突然成為不可用狀態),通常需要連續執行幾次探測均為新狀態才將其標記為轉換後的狀態。
每個後端服務器當前探測的健康狀態探測方法通過.probe進行設定,其結果可由req.backend.healthy變量獲取,也可通過varnishlog中的Backend_health查看或varnishadm的debug.health查看。

backend web01 {
    .host = "192.168.10.132";
    .port = "80";
    .probe = {
        .url = "/";            # 指定哪個url需要varnish請求
        .timeout = 2s;         # 指定超時等待時間
        .interval = 5s;         # 指定檢查時間間隔
        .window = 5;            # 最多嘗試5次
        .threshold = 3;          # 至少有3次成功就宣告backend健康
    }
}

backend web02 {
    .host = "192.168.3.13";
    .port = "80";
    .probe = {
        .url = "/";
        .timeout = 2s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

7.設定緩存時長

sub vcl_backend_response {
    if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
        set beresp.ttl = 2h;
    }                 # 如果url是以圖片格式結尾的緩存2小時
    if (bereq.url ~ "\.(html|css|js|jsp)$") {
        set beresp.ttl = 30m;
    }                  # 如果url是以html|css|js|jsp結尾的緩存30分鐘
}

web緩存服務器varnish-4.1.6的部署及配置詳解