Varnish的配置與部署

      Varnish與一般服務器軟類似,分為master(management)進程和child(worker,主要做cache的工作)進程。master進程讀入命令,進行一些初始化,然后fork并監控child進程。child進程分配若干線程進行工作,主要包括一些管理線程和很多woker線程。

varnish

Varnish的配置與部署

varnish的配置示例:

1、主配置文件的修改:   

      varnish作為web服務的反向代理服務器,要監聽在80端口,因此要修改配置文件:

   vim /etc/varnish/varnish.paramsVarnish的配置與部署

記得創建你所指定的路徑:mkdir /data/varnish/cache 

        并將屬主屬組修改為varnish:chown -R varnish:varnish /data/varnish/cache

2、配置后端主機:   

        vim /etc/varnish/default.vclVarnish的配置與部署

后端主機安裝httpd作為測試

    重讀default.vcl文件:varnsih_reload_vcl 或者通過交互式方式重載配置varnish配置:varnishadm  -S  /etc/varnish/secret -T 127.0.0.1:6082

            命令行下:

                    vcl.load <configname> <filename> 重載配置文件default.vcl(filename),并將其命名
                    vcl.use <configname>使用新生成的配置


        網頁通過http訪問此varnish主機得到:Varnish的配置與部署,說明后端主機配置成功

3、VCL: ”域“專有類型的配置語言

        VCL有多個狀態引擎,狀態之間存在相關性,但狀態引擎彼此間互相隔離;每個狀態引擎可使用return(x)指明關聯至哪個下一級引擎;每個狀態引擎對應于vcl文件中的一個配置段,即為subroutine

變量類型:
        內建變量:
                req.*:request,表示由客戶端發來的請求報文相關;
                bereq.*:由varnish發往BE主機的httpd請求相關;
                resp.*:由varnish響應給client相關;
                obj.*:存儲在緩存空間中的緩存對象的屬性;只讀;
        常用變量:
             bereq.*, req.*:
                bereq.http.HEADERS
                bereq.request:請求方法;
                bereq.url:請求的url;
                bereq.proto:請求的協議版本;
                bereq.backend:指明要調用的后端主機;
                req.http.Cookie:客戶端的請求報文中Cookie首部的值;
                req.http.User-Agent ~ “chrome”
             beresp.*, resp.*:
                beresp.http.HEADERS
                beresp.status:響應的狀態碼;
                reresp.proto:協議版本;
                beresp.backend.name:BE主機的主機名;
                beresp.ttl:BE主機響應的內容的余下的可緩存時長;
             obj.*
                obj.hits:此對象從緩存中命中的次數 >1 表示命中;
                obj.ttl:對象的ttl值
             server.*
                server.ip
                server.hostname
            client.*
                client.ip

介紹幾個VCL配置的實例:

(1)添加報文首部:vim default.vcl

            obj.hits是內建變量,用于保存某緩存項的從緩存中命中的次數;

  在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;
        }

在交互式命令行下手動裝載配置,并使用:

        vcl.load  test default.vcl

        vcl_use test

測試:Varnish的配置與部署

    刷新網頁,再次訪問,會出現HIT via....”字樣

(2)強制對某類資源的請求不檢查緩存,在請求報文中包含以/login|admin 為首的不查緩存,直接送到backend(后端服務器)

     sub   vcl_recv {
                if (req.url ~ “(?i)^/(login|admin)”) {
                    return(pass);
                }
           }

  禁止以curl方式訪問: 

    sub   vcl_recv {
                if (req.http.User-Agent ~ “(?i)^/curl”) {
                    return(synth(403));
                }
           }

測試:Varnish的配置與部署

(3)對于特定類型的資源,例如公開的圖片等,取消其私有標識(cookie),并強行設定其可以由varnish緩存的時長;

    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;
                }
            }

    }

(4)設置后端服務器日志中記錄真實的客戶端地址:

    sub vcl_recv {
            if (req.restarts == 0) {
                if (req.http.X-Fowarded-For) {
                    set req.http.X-Forwarded-For = req.http.X-Forwarded-For + “,” + client.ip;
            } else {
                    set req.http.X-Forwarded-For = client.ip;
                }
           }

    }

并在后端服務器中設置日志格式:

        vim  /etc/httpd/conf/httpd.conf

            將格式修改為:LogFormat  “%{X-Forwarded-For}i  %l  %u  %t  \”%r\“ %>s %b  \” %{Referer}i\” \”%{User-Agent}i\”” combined

測試:Varnish的配置與部署

(5)訪問控制 

            緩存對象的修剪:purge, ban

Varnish的配置與部署

測試:緩存后,用curl查看網頁信息

Varnish的配置與部署

裁剪,將緩存刪除:curl -X PURGE http://172.16.252.187/index.html

Varnish的配置與部署

       

        Banning 在交互式模式 用于臨時按需要清理緩存

示例:

Varnish的配置與部署

在配置文件中,使用ban()函數,相當于purge的用法;示例:
            if (req.method == “BAN”) {
                    ban(“req.http.host == ” + req.http.host + ” && req.url == ” + req.url);
                    return(synth(200, “Ban added”));
            }

清空一個域的緩存:
            ban req.url == / && req.http.host ~ “ilinux.io”(慎用)

(6)負載均衡,Director:

            使用前需要導入:import directors

示例:

Varnish的配置與部署

Varnish的配置與部署

    動靜分離配置示例:

        import directors

        …..

        backend imgsrv1 {
                .host = “192.168.251.11”;
                .port = “80”;
        }
        backend imgsrv2 {
                .host = “192.168.251.12”;
                .port = “80”;
        }
        backend appsrv1 {
                .host = “192.168.251.13”;
                .port = “80”;
        }
        backend appsrv2 {
                .host = “192.168.251.14”;
                .port = “80”;
        }
    sub vcl_init {
                new imgsrvs = directors.random();
                imgsrvs.add_backend(imgsrv1,10);
                imgsrvs.add_backend(imgsrv2,20);
                new staticsrvs = directors.round_robin();
                appsrvs.add_backend(appsrv1);
                appsrvs.add_backend(appsrv2);
                new appsrvs = directors.hash();
                appsrvs.add_backend(appsrv1,1);
                appsrvs.add_backend(appsrv2,1);
        }
     sub vcl_recv {
                  if (req.url ~ “(?i)\.(css|js)$” {
                        set req.backend_hint = staticsrvs.backend();
                }
                if (req.url ~ “(?i)\.(jpg|jpeg|png|gif)$” {
                       set req.backend_hint = imgsrvs.backend();
                } else {
                        set req.backend_hint = appsrvs.backend(req.http.cookie);
                }
      }

(7)基于cookie的session sticky:

sub vcl_init {
            new h = directors.hash();
            h.add_backend(one, 1); // backend ‘one’ with weight ‘1’
            h.add_backend(two, 1); // backend ‘two’ with weight ‘1’
}
sub vcl_recv {
            set req.backend_hint = h.backend(req.http.cookie);
}

(8)健康狀態檢測:

                .probe:定義健康狀態檢測方法;
                        .url:檢測時要請求的URL,默認為”/”;
                        .request:發出的具體請求;
                                .request =
                                        “GET /.healthtest.html HTTP/1.1”
                                        “Host: www.magedu.com”
                                        “Connection: close”
                        .window:基于最近的多少次檢查來判斷其健康狀態;
                        .threshold:最近.window中定義的這么次檢查中至有.threshhold定義的次數是成功的;
                        .interval:檢測頻度;
                        .timeout:超時時長;
                        .expected_response:期望的響應碼,默認為200;

配置示例:   

Varnish的配置與部署

顯示健康狀態信息,在交互式界面中:

        Varnish的配置與部署

4、性能調整:vim /etc/varnish/varnish.params

            根據對網頁的測試來適當調整數值

Varnish的配置與部署


5、varnish日志

1>、varnishstat – Varnish Cache statistics 各種計數器
                -1 批次顯示,只顯示1次
                -1 -f FILED_NAME
                -l:可用于-f選項指定的字段名稱列表;
# varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss
# varnishstat -l -f MAIN -f MEMPOOL
2>、varnishtop – Varnish log entry ranking 將日志文件中相關數據逆序排序
                -1 Instead of a continously updated display, print the statistics once and exit.
                -i taglist,可以同時使用多個-i選項,也可以一個選項跟上多個標簽;篩選
                -I <[taglist:]regex>
                -x taglist:排除列表
                -X <[taglist:]regex>
varnishtop -i RespStatus 查看響應碼
3>、varnishlog – Display Varnish logs 查看實時日志
4>、 varnishncsa – Display Varnish logs in Apache / NCSA combined log format 標準日志格式
          





原創文章,作者:Immortals、zcy,如若轉載,請注明出處:http://www.www58058.com/80431

(2)
Immortals、zcyImmortals、zcy
上一篇 2017-07-27
下一篇 2017-07-28

相關推薦

  • 馬哥教育網絡班第21期+第一周課程作業

    一、 描述計算機的組成及其功能     計算機主機包括:運算器,控制器,存儲器,輸入設備,輸出設備 1、運算器:功能是對程序規定的控制信息進行解釋,根據其要求進行控制,調度程序、數據、地址,協調計算機各部分工作及內存與外設的訪問等。 2、控制器:運算器的功能是對數據進行各種算術運算和邏輯運算,即對從控制器取來…

    Linux干貨 2016-07-12
  • 深入了解正則表達式與grep應用

    剛開始學習正則表達式時候,感覺和看無字天書沒什么分別,迷茫了一段時間后,仔細去理解,慢慢你會發現也沒什么的。認真去鉆研了,多練習,是可以理解他們的含義的。也許正如老師所言,學習linux ,入門的確很陡峭,對于我這個基礎薄弱,智商低于80的人來說的確很吃力。關于正則概念的就不去描述了,說起來真的不好表達,下面通過一些實例來進行深入理解吧。 1.顯示當前系統上…

    2017-11-01
  • Linux進程和計劃任務

                                                      &nbsp…

    系統運維 2016-09-21
  • N22 網絡班-第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。   2、取出最后登錄到當前系統的用戶的相關信息。   3、取出當前系統上被用戶當作其默認shell的最多的那個shell。   4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/maxus…

    Linux干貨 2016-09-06
  • N25—-第三周作業

    1、 列出當前系統上所有已登錄用戶的用戶名。只顯示一次    who | cut -d' ' -f1 | sort -u 2、 取出最后登錄到當前系統的用戶的相關信息。   last | h…

    Linux干貨 2016-12-19
  • 作業管理

    作業管理 ·Linux的作業控制:          前臺作業:通過終端啟動,且啟動后一直占據終端;          后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端) ·如何讓作業運行于…

    Linux干貨 2016-09-11
欧美性久久久久