相識–Varnish

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

VCL?”專有類型的配置語言

VCL有多個狀態引擎,狀態之間存在相關性,但狀態引擎彼此間互相隔離;

每個狀態引擎可使用return( )指明關聯至哪個下一級引擎;

每個狀態引擎對應于vcl文件中的一個配置段。

 

varnish中的內置變量

req.*:request,表示由客戶端發來的請求報文相關;
bereq.*:由varnish發往BE主機的httpd請求相關;
beresp.*:由BE主機響應給varnish的響應報文相關;
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:此對象從緩存中命中的次數;
 ????obj.ttl:對象的ttl值
 server.*
 ????server.ip
 ????server.hostname
 client.*
 ????client.ip

[[ ?Varnish的基本配置 ?]]

1.交互式配置

varnishadm

登錄:

# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082

配置文件相關:

????vcl.list :狀態引擎列表;

????vcl.load <configname> <filename>:裝載那個文件為配置文件;

????vcl.use <configname>:使用哪個vcl文件

????vcl.discard:刪除;

????vcl.show [-v] <configname>:查看指定的配置文件的詳細信息,可看默認配置;
????param.show -l:顯示運行時參數列表;

????param.show <PARAM>:指定顯示哪個參數

????param.set <PARAM> <VALUE>:修改參數

????storage.list:顯示存儲列表

????backend.list:顯示后端服務器列表

2.強制對某類資源的請求不檢查緩存

示例:在請求報文中包含以/login|admin 為首的不查緩存,直接送到backend(后端服務器)

sub vcl_recv {

????if (req.url ~ "(?i)^/(login|admin)") {

????return(pass);

    }
}
(?i)---不區分大小寫

3.拒絕某種請求訪問

sub vcl_recv {

????if (req.http.User-Agent ~ “(?i)^/curl”) {

????return(synth(403));

? ? }

}

4.對特定類型的資源取消私有的Cookie標識,并設定其可在varnish緩存的時長

if (beresp.http.cache-control !~ “s-maxage”) {

    if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif)$") {

????    unset beresp.http.Set-Cookie;

????    set beresp.ttl = 3600s;

    }

}

5.設置后端服務器日志中記錄的真實的客戶端IP

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"

6.對后端主機進行健康狀態檢測

.probe:定義健康狀態檢測方法;

.url:檢測時請求的URL,默認為”/”;

.request:發出的具體請求;

.window:基于最近的多少次檢查來判斷其健康狀態;

.threshhold:最近.window中定義的這么次檢查中至有.threshhold定義的次數是成功的;

.interval:檢測頻度;

.timeout:超時時長;

.expected_response:期望的響應碼,默認為200;

示例:

backend websrv1 {

????.host = "192.168.1.16";

????.port = "80";

????.probe = {

????      .url= "/.test.html";           需要先創建這個測試頁面
????}
}

7.varnish的性能優化

thread_pools:最好小于或等于CPU核心數量;

thread_pool_max:每線程池的最大線程數;

thread_pool_min:額外意義為“最大空閑線程數”;

thread_pool_timeout:線程超時時間

thread_pool_add_delay:創建新線程

thread_pool_destroy_delay:殺死空閑線程延遲時間

設置方式:

/etc/varnish/varnish.params (永久有效)

param.set



[[ ?VCL配置的實例 ?]]

1.負載均衡

import directors;?       導入模塊

backend websrv1 {

????.host = "192.168.1.16";

????.port = "80";

}

backend aebsrv2 {

????.host = "192.168.1.47";

????.port = "80";
}

sub vcl_init {                    定義集群

????new webcluster = directors.round_robin();     調度方法

????     webcluster.add_backend(websrv1);

????     webcluster.add_backend(websrv2);

}

sub vcl_recv {              

     set req.backend_hint = webcluster.backend();

}

2.varnish動靜分離

backend websrv1 {

????.host = "192.168.1.16";

????.port = "80";

}

backend aebsrv2 {

????.host = "192.168.1.47";

????.port = "80";
}

sub vcl_recv {

     if (req.url ~ "(?i)\.(jpg|png|gif)$") {

????     set req.backend_hint = websrv1;

     } else {

???     ?set req.backend_hint = websrv2;

    }

}

 

 

掌握 varnishstat、varnishtop

1、varnishstat?– Varnish Cache statistics ? ? 各種計數器

-f FILED_NAME

-l: 可用于-f選項指定的字段名稱列表;

-x: xml輸出格式

示例:

varnishstat ?-f MAIN.cache_hit -f MAIN.cache_miss

2、varnishtop?– Varnish log entry ranking ? ?將日志文件中相關數據排序

-i taglist,可以同時使用多個-i選項,也可以一個選項跟上多個標簽;

-I <[taglist:]regex>:僅顯示被模式匹配到的條目

-x taglist:排除列表

-X <[taglist:]regex>:僅顯示不被模式匹配到的條目

-C:忽略字符大小寫

3、varnishlog?– Display Varnish logs ? ? ? ?查看實時日志

4、varnishncsa?– Display Varnish logs in Apache / NCSA combined log format ? ? ?標準日志格式

原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/88357

(0)
nenenene
上一篇 2017-11-13
下一篇 2017-11-13

相關推薦

  • 權限管理

     權限管理:  ls -l       rwxrwxrwx:              左三位:定義user(owner)的權限              中三位:定義g…

    Linux干貨 2016-12-21
  • N25_第四周

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 cp -R /etc/skel /home/tuser1chmod 700 -R /home/tuser1 2、編輯/etc/group文件,添加組hadoop。 vim /etc/group hadoop:x:1010:1…

    Linux干貨 2016-12-25
  • linux基礎中的基礎 —- 用戶管理、文本處理、正則表達式等命令的使用(博客第三周作業)

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。     who | cut -d' ' -f1 | uniq 2、取出最后登錄到當前系統的用戶的相關信息。     who | tail -1 3、取出當前系統上被用戶當作其默認shell的最…

    Linux干貨 2016-07-22
  • 來馬哥教育后

    來北京三天了,說實話,我長了不少見識,甚至可以說是見過了以前一些從沒想到過的事情,我拼了命往大城市來,如今如我所愿了,我來的時候發誓對自己說:我要留在北京,我也要積累足夠的資本讓自己真正成為大城市的上層社會人士,現在吃多少苦我都無所謂。 我以前在建筑工地的時候想:我將來能學IT是最幸福的事了。當時真是這么想的,等我真到馬哥教育,我發現,我把問題想的太簡單,就…

    Linux干貨 2018-03-26
  • N25第五周博客作業

    第五周博客作業   1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;   2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;   3、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行; &nbs…

    Linux干貨 2016-12-28
  • 第九周腳本練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; awk -F: ‘{if($NF!=”/sbin/nologin”) print $1}’ /etc/passwd | wc -l 2、寫一個腳本 (1) 獲取當前主機的主機名,保存于ho…

    Linux干貨 2017-03-30
欧美性久久久久