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 20:44
下一篇 2017-07-28 08:16

相關推薦

  • shell腳本編程之if、case條件語句

    程序執行三種順序     順序執行          選擇執行          循環執行       &nb…

    Linux干貨 2016-08-18
  • SSH會話劫持實現端口轉發

    在進行滲透測試時,我們有時候會碰到搭建的測試環境、產品服務器、DMZ或者其他類似的機器群的情況,這時我們完全可以把它們看作跳板。這些系統被設計成對外交互的接口,這時候我們考慮對其他域里的用戶進行SSH會話劫持是個不錯的選擇。 那么如果你擁有了某一個跳板的控制權限,想要通過另一個域的用戶對遠程域進行訪問會怎么辦呢?當然,這時候你是沒有密碼、密鑰的,你不能拋棄二…

    系統運維 2015-03-23
  • 馬哥教育網絡班22期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登陸多次,則只顯示一次即可。     who | cut -d' ' -f1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。     who | sort -t' ' -k4 | …

    Linux干貨 2016-08-29
  • CentOS系統啟動流程

    Linux系統(Centos 5、6)啟動流程 一、POST加電自檢 Power-On-Self-Test 按下電源鍵以后,系統調用存儲在ROM中的BIOS和存儲在RAM中的CMOS(用來保存各項參數的設定)完成系統硬件狀態的檢查,如果硬件有問題則提示用戶問題嚴重無法開機的會發出警報聲音;硬件自檢完成后進入下一步。 二、Boot Sequence與…

    Linux干貨 2016-11-24
  • 【26期】Linux第一周學習小總結

        知識不在長短,而在于其中的精煉程度,字典每個字沒有一頁的篇幅,卻被大面積推廣,之所以沒有再把學到的全部搬運到博客上來,就是為了給大家一點可看的東西,也許我自己認為的精煉是有點簡短了,那我就再更新一下,再復習一下,學到的whatis 和 man命令。     第一周匆匆而過,學過的知識,過遍腦…

    2017-07-14
  • 22期第十三周課堂練習

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)   1)共享名為shared,工作組為magedu;   2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;   3)添加s…

    Linux干貨 2017-01-09
欧美性久久久久