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