varnish緩存服務器構建疑問

標題索引


  • 追朔原因

  • 實驗分解

  • 抓包分析


追朔原因【此文需要待續】

    當下是互聯網時代也是CDN緩存時代,緩存可以提供互聯網80%流量,因此緩存的構建和提高緩存的命中率是互聯網行業必不可少的方式和手段,另外在http1.1協議盛行的時代,需非常瞭解http協議才能對apache、nginx、haproxy等服務器原理了解更爲透徹,互聯網CDN內容發佈商緩存命中率才能大大提供,用戶才能得到好的體驗。

實驗分解

    當客戶端瀏覽器cache-control:max-age=0時,表示緩存服務器通常需要將請求轉發給源服務器(具體可參考圖解http協議書籍89頁);

    當客戶端瀏覽器cache-control:max-age>0時,表示客戶端可以從緩存服務器端直接獲取數據。

vcl 4.0;                                                                                                                                                                                                                                                                      
#-------------------------------------------------------
#裝載負載均衡模塊
import directors;
import std;
#-------------------------------------------------------
#在全局配置中配置acl,在recv函數中調用acl
acl aclpurges {
            "192.168.40.2"/24;
            "127.0.0.1"/24;
        }
#-------------------------------------------------------
#定義健康性檢測,方便backend後端調用
probe healthcheck {
    .url = "/index.html";
    .window = 5;
    .threshold = 4;
    .interval = 10s;
    .timeout = 2s;
}
#--------------------------------------------------------
#定義backend後端服務器
backend phpserver01 {
    .host = "192.168.40.1";
    .port = "80";
    .probe = healthcheck;
}
backend phpserver02 {
    .host = "192.168.40.2";
    .port = "80";
    .probe = healthcheck;
}
backend picserver11 {
    .host = "192.168.40.11";
    .port = "80";
    .probe = healthcheck;
}
backend picserver12 {
    .host = "192.168.40.12";
    .port = "80";
    .probe = healthcheck;
}
backend javaserver21{
    .host = "192.168.40.21";
    .port = "80";
    .probe = healthcheck;
}
backend javaserver22{
    .host = "192.168.40.22";
    .port = "80";
    .probe = healthcheck;
}
#vcl初始化組信息
sub vcl_init{
    #定義後端服務器組
    #若需會話綁定時
    #new php_group = directors.hash();
    new php_group = directors.round_robin();
    new pic_group = directors.round_robin();
    new java_group = directors.round_robin();
    #default_group
    php_group.add_backend(phpserver01);
    php_group.add_backend(phpserver02);
    #picserver_group
    pic_group.add_backend(picserver11);
    pic_group.add_backend(picserver12);
    #javaserver_group
    java_group.add_backend(javaserver21);
    java_group.add_backend(javaserver22);
}
#--------------------------------------------------------
sub vcl_recv {
        #+++++++對不同資源進行分離調度
        #若需會話綁定時,分組中已經組,只需根據cookie進行hash
        #set req.backend_hint = php_group.backend(req.http.cookie);
        if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$"){
            set req.backend_hint = pic_group.backend();
        }
        if (req.url ~ "(?i)\.(jsp)"){
            set req.backend_hint = java_group.backend();
        }else{
            set req.backend_hint = php_group.backend();
        }
        #+++++++對特定資源直接調用pass函數進行反向代理
        if ( req.url ~ "(?i)^/(login|admin)"){
            return(pass);
        }
        #+++++++對URL發生改變的請求,即URL重寫的請求X-forwarded-For
        if (req.restarts == 0 ){
            if (req.http.X-Forwarded-For) {
                set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip;
            } else {
                set req.http.X-Forwarded-For = client.ip;
            }
        }
        #+++++++對緩存資源進行修剪,默認基於URL進行緩存,修剪時需保持URL不變
        if ( req.method == "PURGE" ){
            if ( !client.ip ~ aclpurges) {
                #訪問時http://172.18.27.24/123.jpg 
                #修剪時curl -X PURGE http://172.18.27.24/123.jpg
                return(synth(405,"You are not allowed" + client.ip));
            }
            return (purge);
        }
        #+++++++當對一類資源進行修改時可以通過varnishadmin命令行修剪
        #如:ban req.rul ~ (?i).(jpg|pgn)批量進行修剪
        if (req.method != "GET" && req.method != "HEAD") {
            return (pipe);
        }
        #+++++++定義緩存的內容
        if (req.url ~ "\.(jpe?g|png|gif|pdf|gz|tgz|bz2|tbz|tar|zip|tiff|tif)$" || req.url ~ "/(p_w_picpath|(p_w_picpath_(?:[^/]|(?!view.*).+)))$") {
            return (hash);
        }
        if (req.url ~ "\.(svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|flv)$") {
        return (hash);
        }
        if (req.url ~ "\.(xls|vsd|doc|ppt|pps|vsd|doc|ppt|pps|xls|pdf|sxw|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm)$") {
        return (hash);
        }
        if (req.url ~ "\.(css|js)$") {
        return (hash);
        }
         if (req.http.Authorization || req.http.Cookie ~ "(^|; )(__ac=|_ZopeId=)") {
        /* Not cacheable by default */
        return (pipe);
        }   
}
#--------------------------------------------------------
sub vcl_backend_response {
        #+++++++對特定資源強行進行緩存
        if ( beresp.http.cache-control !~ "s-maxage" ) {
             if ( bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$" ) {
                 unset beresp.http.Set-Cookie;
                 set beresp.ttl = 3600s;
           }
        }
        #定義緩存策略
        if (beresp.ttl <= 0s || beresp.http.Set-Cookie || beresp.http.Vary == "*") {
        # Mark as "Hit-For-Pass" for the next 60 minutes - 24 hours
            if (bereq.url ~ "\.(jpe?g|png|gif|pdf|gz|tgz|bz2|tbz|tar|zip|tiff|tif)$" || bereq.url ~ "/(p_w_picpath|(p_w_picpath_(?:[^/]|(?!view.*).+)))$") {
                set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h;
            } elseif (bereq.url ~ "\.(svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|flv)$") {
                set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h;
            } elseif (bereq.url ~ "\.(xls|vsd|doc|ppt|pps|vsd|doc|ppt|pps|xls|pdf|sxw|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm)$") {
                set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h;
            } elseif (bereq.url ~ "\.(css|js)$") {
                set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 24h;
            } else {
                set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 1h;
            }
        }                                                 
}

#---------------------------------------------------------
sub vcl_deliver {
        #構建http報頭時添加命中或非命中字段
        if (obj.hits>0) {
                set resp.http.X-cache = "Hit via"  + server.ip;
        } else {
                set resp.http.X-cache = "Miss from"  + server.ip;
                }   
}
#----------------------------------------------------------
#varnish優化,
#在運行時進行調整相關參數,通過命令進行調整,
#thread_pools:最大池子數 param.set thread_pools 4
#thread_pool_max:池子最大線程數 param.set thread_max 8000
#thread_pool_min:池子最小線程數 param.set thread_max 500
#永久性優化時,通過編寫配置文件進行調整參數
#DAEMON_OPTS="-p thread_pool_min=500 -p thread_pool_max=8000 -p thread_pools=4"


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