內容概覽:
php
一、varnish介紹
二、Varnish程序結構
三、Vcl內置函數和處理流程(狀態引擎)
四、配置拓撲和環境說明
五、varnish安裝和簡單配置
六、移除單個緩存對象
七、在vcl中使用條件判斷
八、動靜分離
九、健康狀態檢測
十、負載均衡
十一、varnish的線程模型
html
Varnish是一款高性能的開源HTTP加速器(其實就是帶緩存的反向代理服務),能夠把http響應內容緩存到內存或文件中,從而提升web服務器響應速度。與傳統的 squid 相比,varnish 具備性能更高、速度更快、管理更加方便等諸多優勢,不少大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。挪威最大的在線報紙 Verdens Gang 使用3臺Varnish代替了原來的12臺Squid,性能比之前更好。
node
官方地址:web
https://www.varnish-cache.org/
算法
管理進程:編譯VCL並應用新配置、監控varnish、初始化varnish,並提供一個CLI。json
Child/Cache線程有幾類:vim
Acceptor:接收新的鏈接請求;後端
Worker:用於處理並響應用戶請求;緩存
Expiry:從緩存中清理過時cache objectbash
日誌:Shared Memory Log, 共享內存內存日誌大小通常90MB;分爲兩部分:前一部分爲計數器、後一部分爲客戶請求相關的數據。
Vcl內置函數:vcl配置的緩存策略在此些內置函數發揮做用;
vcl_recv:用於接受和處理請求。當請求到達併成功接收後被調用,經過判斷請求的數據來決定如何處理請求。例如如何響應、怎麼響應、使用哪一個後端服務器等。
vcl_fetch:根據服務器端的響應做出緩存決策,如判斷獲取的內容來決定是將內容放入緩存,仍是直接返回給客戶端。
vcl_pipe:對於沒法理解的用戶請求,將請求直接發日後端主機;
vcl_hash:自定義hash生成時的數據來源
vcl_pass:用於將請求直接傳遞至後端主機,後端主機在應答數據後將應答數據發送給客戶端,但不進行任何緩存。
vcl_hit:從緩存中查找到緩存對象時要執行的操做;
vcl_miss:從緩存中款查找到緩存對象時要執行的操做;
vcl_deliver:將用戶請求的內容響應給客戶端時用到的方法;
vcl_error:在varnish端合成錯誤響應而時;
vcl的配置語法:
(1) //, #, /*comment*/用於註釋;
(2) sub $NAME 用於定義函數;
(3) 不支持循環;
(4) 有衆多內置變量;
(5) 支持終止語句,沒有返回值;
(6) 「域」專用語言;
(7) 操做符: =, ==, ~, !, &&, ||
vcl狀態轉換圖:
每一個請求都被單獨處理,處理過程當中將處在不一樣的狀態。退出一種狀態就會轉入下一個狀態。狀態之間是有關聯的,而不是孤立的,下面的圖中能夠清楚的看出狀態的轉換,以及不一樣狀態所要通過的處理函數。
官方原圖:
一、在任何引擎中都可使用:
Now:獲取當前系統當前時間
.host:獲取當前主機名和ip地址
.port:後端服務器名稱和端口
二、用於處理請求階段:
client.ip,server.hostname, server.ip, server.port :都不解釋
req.request:請求方法
req.url:請求的URL
req.proto:HTTP協議版本
req.backend:用於服務這次請求的後端主機;
req.backend.healthy:後端主機健康狀態;
req.http.HEADER:引用請求報文中指定的首部;
req.can_gzip:客戶端是否可以接受gzip壓縮格式的響應內容;
req.restarts:此請求被重啓的次數;
三、varnish向backend主機發起請求前可用的變量
bereq.request:請求方法
bereq.url:請求url
bereq.http.HEADER:調用服務這次請求的後端主機的報文首部
bereq.connect_timeout:等待與beckend創建鏈接的超時時長
四、backend主機的響應報文到達本主機(varnish)後,將其放置於cache中以前可用的變量
beresp.do_stream:流式響應(接收一個請求,響應一個請求)
beresp.do_gzip:是否壓縮以後再存入緩存;
beresp.do_gunzip:若是從後端收到壓縮格式的報文,是否解壓縮在存放下來
beresp.http.HEADER:獲取httpd的首部信息
beresp.proto:HTTP協議版本
beresp.status:響應狀態碼
beresp.response:響應時的緣由短語
beresp.ttl:響應對象剩餘的生存時長,單位爲秒鐘;
beresp.backend.name:此響應報文來源backend名稱;
beresp.backend.ip:獲取後端響應ip
beresp.backend.port:獲取後端響應端口
beresp.storage:強制varnish將緩存存儲到緩存後端
五、緩存對象存入cache以後可用的變量
obj.proto:響應時使用的協議
obj.status:響應時使用的狀態碼
obj.response:服務器返回響應報文的狀態碼
obj.ttl:緩存對象生存時長
obj.hits:緩存對象被用做響應時的次數
obj.http.HEADER:調用對應的響應報文
六、在決定對請求鍵作hash計算時可用的變量
req.hash:指明把什麼做爲hash的鍵,做爲緩存的鍵
七、在爲客戶端準備響應報文時可用的變量
resp.proto:指明使用什麼協議響應
resp.status:執行響應狀態嗎
resp.response:返回響應的狀態碼
resp.http.HEADER:調用響應報文狀態碼
各種報文使用位置和使用權限:
四、配置拓撲和環境說明:
主機名 |
Ip地址 |
功能描述 |
Varnish |
172.16.4.100 |
接收用戶訪問,而且將請求轉發到後端web服務,最後將請求結果緩存 |
Web-01 |
172.16.4.101 |
提供web服務 |
Web-02 |
172.16.4.102 |
提供web服務 |
全部服務器系統環境以下:
[root@varnish ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@varnish ~]# uname -r 2.6.32-504.el6.x86_64 [root@varnish ~]# uname -m x86_64
Web服務器已經配置好服務,而且varnish服務器能夠訪問,結果以下配置過程略:
[root@varnish ~]# curl 172.16.4.101 web-01 [root@varnish ~]# curl 172.16.4.102 web-02
五、varnish安裝和簡單配置:
此處使用的varnish軟件爲3.0.6
下載地址:https://repo.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnish/
[root@node1 ~]# ll varnish-* -rw-r--r-- 1 root root 454496 Oct 21 2014 varnish-3.0.6-1.el6.x86_64.rpm -rw-r--r-- 1 root root 360284 Oct 21 2014 varnish-docs-3.0.6-1.el6.x86_64.rpm -rw-r--r-- 1 root root 42620 Oct 21 2014 varnish-libs-3.0.6-1.el6.x86_64.rpm [root@node1 ~]# rpm -ivh *.rpms
安裝完成生成的文件:
/etc/sysconfig/varnish #配置文件
/etc/varnish/default.vcl #vcl配置
/usr/sbin/varnishd #主程序
varnish啓動參數:
-a:指定監聽地址和端口
-b:指明後端主機和端口
-C:顯示vcl編譯後的代碼,轉換成c語言後退出
-d:打開debug模式
-F:運行在前臺
-fconfig:指明配置文件
-g:指明以哪一個組的身份運行
-h:指明哈希算法
-l:共享內存區域大小
-n:當前實例的名稱
-P:指明pid文件
-s:使用指定的存儲後端
-T:提供一個管理接口,默認是6081,推薦設置爲80
支持的哈希算法:
simple_list
classic
critbit
varnish支持後端緩存存儲機制:
-stype
malloc[,size] #表示在內存中緩存
file[,path[,size[,granularity]]] #使用一個文件來保存全部的緩存
persistent,path,size #不成熟的存儲機制
說明:varnish服務只要一重啓會清空全部緩存
Varnish配置選擇,一共有四種分別是
## Alternative 1 最小化配置
## Alternative 2 表示使用cvl緩存配置
## Alternative3 高級配置
## Alternative 4 自定義配置
這裏選擇使用alternative 3:修改varnish配置文件,這裏設置爲將緩存放到內存中大小是64M
[root@varnish ~]# vim /etc/sysconfig/varnish VARNISH_VCL_CONF=/etc/varnish/default.vcl #指定緩存策略配置文件 VARNISH_LISTEN_PORT=80 #varnish監聽端口 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 #管理地址 VARNISH_ADMIN_LISTEN_PORT=6082 #管理端口 VARNISH_SECRET_FILE=/etc/varnish/secret #密鑰文件 VARNISH_MIN_THREADS=50 #最少線程:varnish在啓動時最少啓動多少線程 VARNISH_MAX_THREADS=3000 #最多啓動線程(聽說啓動超過5000後不是特別穩定) VARNISH_THREAD_TIMEOUT=120 #線程超時時間 VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #緩存文件 VARNISH_STORAGE_SIZE=1G #緩存大小 VARNISH_STORAGE_SHM=64M #定義內存大小 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}" #將緩存定義到內存中,指定的大小爲VARNISH_STORAGE_SHM變量定義的值 VARNISH_TTL=120 DAEMON_OPTS="-a${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ #將全部定義傳遞給啓動參數 -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE}"
設置完成varnish配置文件,啓動服務就能夠正常監聽80端口,可是,因爲沒有後端主機因此沒法響應客戶端請求,須要修改default.vcl進行緩存相關配置
添加後端主機,這裏先添加一個172.16.4.101
[root@varnish ~]# vim /etc/varnish/default.vcl backend default { .host ="172.16.4.101"; .port ="80"; }
啓用以下配置:
#表示後端web服務器記錄地址爲客戶端地址,而不是varnish地址 } subvcl_recv { 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; } } #若是請求中不包含GET,HEAD,PUT,POST,TRACE,OPTIONS,DLETE,將請求發日後端 if(req.request != "GET" && req.request != "HEAD" && req.request!= "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { /*Non-RFC2616 or CONNECT which is weird. */ return (pipe); } #若是請求不是GET和HEAD,那麼將請求發送給pass if(req.request != "GET" && req.request != "HEAD") { /*We only deal with GET and HEAD by default */ return (pass); } #若是報文中有Cookie信息,那麼不該該緩存 if(req.http.Authorization || req.http.Cookie) { /*Not cacheable by default */ return (pass); } return(lookup); } #驗證緩存命中 sub vcl_deliver { if(obj.hits>0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } return(deliver); }
設置完成啓動服務,只要保證80和6082端口爲varnish監聽便可
[root@varnish ~]# service varnish start [root@varnish ~]# netstat -lntup | grep -E"80|6082" tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 53510/varnishd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 53511/varnishd
設置完成訪問兩次就能夠看到,看定義的X-Cache的值爲HIT表示緩存成功
purge用於清理緩存中的某特定對象及其變種(variants),所以,在有着明確要修剪的緩存對象時可使用此種方式。HTTP協議的PURGE方法能夠實現purge功能,不過,其僅能用於vcl_hit和vcl_miss中,它會釋放內存工做並移除指定緩存對象的全部Vary:-變種,並等待下一個針對此內容的客戶端請求到達時刷新此內容。另外,其通常要與return(restart)一塊兒使用。下面是個在VCL中配置的示例。
#指定容許使用purgers的地址 acl purgers { "127.0.0.1"; "192.168.0.0"/24; } #若是請求purers的地址不是指定的客戶端地址,返回405錯誤 sub vcl_recv { if(req.request == "PURGE") { if(!client.ip ~ purgers) { error405 "Method not allowed"; } return(lookup); } } #若是緩存命中,並且請求方法是purgers則刪除緩存,而且返回200響應碼 sub vcl_hit { if(req.request == "PURGE") { purge; error200 "Purged"; } } #若是請求是purgers,可是沒有緩存則返回404錯誤 sub vcl_miss { if(req.request == "PURGE") { purge; error404 "Not in cache"; } } #若是將請求發送給了pass返回502錯誤 sub vcl_pass { if(req.request == "PURGE") { error502 "PURGE on a passed object"; } }
啓用默認vcl_recv配置時使用的方式:須要運行容許運行PURGE
subvcl_recv { 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; } } if (req.request == "PURGE" ) { if (!client.ip ~ purgers) { error 405 "Method notallowed."; } } if (req.request != "GET"&& req.request != "HEAD"&& req.request != "PUT"&& req.request != "POST"&& req.request != "TRACE"&& req.request != "OPTIONS"&& req.request != "DELETE"&& req.request != "PURGE" ){ #此處須要添加PURGE /* Non-RFC2616 or CONNECT which isweird. */ return (pipe); } if (req.request != "GET"&& req.request != "HEAD" && req.request !="PURGE") { #此處須要添加PURGE /* We only deal with GET and HEAD bydefault */ return (pass); } if (req.http.Authorization ||req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); }
這個時候就配置完成了,可是這樣作有一個問題,那就是varnish服務一旦重啓就會清除全部緩存數據,顯然這個是不可取的方案。
可使用varnishadm命令打開varnish的管理接口應用新的配置文件
鏈接varnishadm,而且列出經常使用參數
[root@varnish ~]# varnishadm -S /etc/varnish/secret-T 127.0.0.1:6082 200 ----------------------------- Varnish Cache CLI 1.0 ----------------------------- Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit varnish-3.0.6 revision 1899836 Type 'help' for command list. Type 'quit' to close CLI session. varnish> help 200 help [command] ping [timestamp] #測試服務器活動狀態的 auth response #作認證的 quit #退出 banner #顯示banner信息 status #顯示當前服務器狀態信息 start #啓動子進程 stop #關閉子進程 vcl.load <configname> <filename> #裝載val信息 vcl.inline <configname><quoted_VCLstring> vcl.use <configname> #使用新的vcl配置 vcl.discard <configname> #刪除 vcl.list #顯示當前全部vcl配置 vcl.show <configname> #顯示vcl內置詳細信息 param.show [-l] [<param>] param.set <param> <value> panic.show panic.clear storage.list backend.list backend.set_health matcher state ban.url <regexp> ban <field> <operator> <arg>[&& <field> <oper> <arg>]... ban.list
設置使用新配置文件
varnish> vcl.load test1 default.vcl #裝載default.vcl配置文件,並命名爲test1 200 VCL compiled. varnish> vcl.list 200 active 2 boot #boot處於活動狀態 available 0 test1 #test1已經存在 varnish> vcl.use test1 #使用test1配置文件 200 varnish> vcl.list 200 available 2 boot active 0 test1 #如今處於活動狀態的就是test1
驗證:是否能夠手動移除單個緩存
[root@varnish ~]# curl -Ihttp://172.16.4.100/index.html HTTP/1.1 200 OK Server: Apache/2.2.15 (CentOS) Last-Modified: Wed, 27 May 2015 01:40:12 GMT ETag: "80101-5-5170652f10295" Content-Type: text/html; charset=UTF-8 Content-Length: 5 Accept-Ranges: bytes Date: Wed, 27 May 2015 10:50:53 GMT X-Varnish: 989040343 989040342 Age: 1 Via: 1.1 varnish Connection: keep-alive X-Cache: HIT #正常訪問緩存是命中的 [root@varnish ~]# curl -I -X PURGEhttp://172.16.4.100/index.html HTTP/1.1 200 Purged Server: Varnish Content-Type: text/html; charset=utf-8 Retry-After: 5 Content-Length: 379 Accept-Ranges: bytes Date: Wed, 27 May 2015 10:51:33 GMT X-Varnish: 989040344 Age: 0 Via: 1.1 varnish Connection: close X-Cache: MISS #使用PURGE緩存沒有命中,表示緩存已經被刪除了
單分支:
if(CONDITION) { ...; }
雙分支:
if(CONDITION) { ...; } else { ...; }
多分支:
if(CONDITION1) { ... } elseif(CONDITION2) { ... } else { ... }
上面驗證命中的vcl就是一個雙分支的判斷語句:
if(obj.hits>0) { setresp.http.X-Cache = "HIT"; } else { setresp.http.X-Cache= "MISS"; }
一個多分支if判斷語句:
subvcl_recv { if (req.http.host ~ "(?i)^(www.)?xmfb.com$"){ set req.http.host = "www.xmfb.com"; #將訪問www.xmfb.com的請求轉發到www主機 set req.backend = www; } elsif (req.http.host ~ "(?i)^p_w_picpaths.xmfb.com$"){ set req.backend = p_w_picpaths; #將訪問p_w_picpaths.xmfb.com的請求轉發到p_w_picpaths的主機 } else { error 404 "Unknown virtual host"; #其餘請求404響應 } }
示例:拒絕指定IP訪問,sub vcl_recv中定義單分支if語句便可
if(client.ip == "172.16.4.199") { #若是客戶端ip是172.16.4.199 error404 "haha"; #返回404錯誤便可 }
設置完成重載服務
varnish> vcl.load test2 default.vcl varnish> vcl.use test2
172.16.4.199客戶端訪問以下所示:
Varnish中可使用director指令將一個或多個近似的後端主機定義爲一個邏輯組,並能夠指定的調度方式(也叫挑選方法)來輪流將請求發送至這些主機上。不一樣的director可使用同一個後端主機,而某director也可使用「匿名」後端主機(在director中直接進行定義)。每一個director都必須有其專用名,且在定義後必須在VCL中進行調用,VCL中任何能夠指定後端主機的位置都可以按需將其替換爲調用某已定義的director。
配置示例:
#定義兩個後端主機,若是指定多個後端後端主機必須在配置文件中指明調用指定的後端主機 backend web1 { .host ="172.16.4.101"; .port ="80"; } backend web2 { .host ="172.16.4.102"; .port ="80"; } #配置動靜分離:只須要在sub vcl_recv中定義一個雙分支判斷,將php結尾的內容交給web1,其餘內容 if(req.url ~ "\.php$") { setreq.backend = web1; } else { setreq.backend = web2; }
Varnish能夠檢測後端主機的健康狀態,在斷定後端主機失效時能自動將其從可用後端主機列表中移除,而一旦其從新變得可用還能夠自動將其設定爲可用。爲了不誤判,Varnish在探測後端主機的健康狀態發生轉變時(好比某次探測時某後端主機忽然成爲不可用狀態),一般須要連續執行幾回探測均爲新狀態纔將其標記爲轉換後的狀態。
每一個後端服務器當前探測的健康狀態探測方法經過.probe進行設定,其結果可由req.backend.healthy變量獲取,也可經過varnishlog中的Backend_health查看或varnishadm的debug.health查看。
配置示例:
probe chk { .window =5; .threshold= 3; .interval=3s; .timeout =1s; } backend web1 { .host ="172.16.4.101"; .port ="80"; .probe =chk; } backend web2 { .host ="172.16.4.102"; .port ="80"; .probe =chk; }
.probe中的探測指令經常使用的有:
(1) .url:探測後端主機健康狀態時請求的URL,默認爲「/」;
(2) .request: 探測後端主機健康狀態時所請求內容的詳細格式,定義後,它會替換.url指定的探測方式;好比:
.request=
"GET/.healthtest.html HTTP/1.1"
"Host:www.xmfb.com"
"Connection:close";
(3) .window:設定在斷定後端主機健康狀態時基於最近多少次的探測進行,默認是8;
(4) .threshold:在.window中指定的次數中,至少有多少次是成功的才斷定後端主機正健康運行;默認是3;
(5) .initial:Varnish啓動時對後端主機至少須要多少次的成功探測,默認同.threshold;
(6) .expected_response:指望後端主機響應的狀態碼,默認爲200;
(7) .interval:探測請求的發送週期,默認爲5秒;
(8) .timeout:每次探測請求的過時時長,默認爲2秒;
驗證:在管理接口使用backend.list命令能夠查看後端服務器狀態
varnish> backend.list 200 Backend name Refs Admin Probe default(172.16.4.101,,80) 4 probe Healthy (no probe) web1(172.16.4.101,,80) 4 probe Healthy 5/5 #表示檢查了後端服務器5次,5次都是正常的 web2(172.16.4.102,,80) 4 probe Healthy 5/5
當掉web-01服務器,在查看後端服務器狀態
varnish> backend.list 200 Backend name Refs Admin Probe default(172.16.4.101,,80) 4 probe Healthy (no probe) web1(172.16.4.101,,80) 4 probe Sick 0/5 #表示後端服務器掛了 web2(172.16.4.102,,80) 4 probe Healthy 5/5
說明:若是進行訪問測試已掛服務器還正常,說明內容是從緩存中返回的
Varnish中可使用director指令將一個或多個近似的後端主機定義爲一個邏輯組,並能夠指定的調度方式(也叫挑選方法)來輪流將請求發送至這些主機上。不一樣的director可使用同一個後端主機,而某director也可使用「匿名」後端主機(在director中直接進行定義)。每一個director都必須有其專用名,且在定義後必須在VCL中進行調用,VCL中任何能夠指定後端主機的位置都可以按需將其替換爲調用某已定義的director。
配置示例:
#定義多個後端主機並配置健康檢查 probe chk{ .window = 5; .threshold = 3; .interval =3s; .timeout = 1s; } backendweb1 { .host = "172.16.4.101"; .port = "80"; .probe = chk; } backendweb2 { .host = "172.16.4.102"; .port = "80"; .probe = chk; } # 負載均衡定義 director webservers random { .retries = 3; { .backend = web1; .weight = 1; } { .backend = web2; .weight = 1; } } # 設置完成負載均衡,必需要調用,不然會報錯 set req.backend = webservers;
如上示例中,web1爲顯式定義的後端主機,而webservers這個directors還包含了一個「匿名」後端主機(backweb2.xmfb.com)。webservers從這兩個後端主機中挑選一個主機的方法爲random,即以隨機方式挑選。
Varnish的director支持的挑選方法中比較簡單的有round-robin和random兩種。其中,round-robin類型沒有任何參數,只須要爲其指定各後端主機便可,挑選方式爲「輪叫」,並在某後端主機故障時再也不將其視做挑選對象;random方法隨機從可用後端主機中進行挑選,每個後端主機都須要一個.weight參數以指定其權重,同時還能夠director級別使用.retires參數來設定查找一個健康後端主機時的嘗試次數。
Varnish 2.1.0後,random挑選方法又多了兩種變化形式client和hash。client類型的director使用client.identity做爲挑選因子,這意味着client.identity相同的請求都將被髮送至同一個後端主機。client.identity默認爲client.ip,但也能夠在VCL中將其修改成所須要的標識符。相似地,hash類型的director使用hash數據做爲挑選因子,這意味着對同一個URL的請求將被髮往同一個後端主機,其經常使用於多級緩存的場景中。然而,不管是client還hash,當其傾向於使用後端主機不可用時將會從新挑選新的後端其機。
另外還有一種稱做fallback的director,用於定義備用服務器,以下所示:
directorb3 fallback { { .backend = www1; } { .backend = www2; } // will only be used ifwww1 is unhealthy. { .backend = www3; } // will only be used ifboth www1 and www2 // are unhealthy. }
在vcl_recv上,通常要用
setreq.backend = DIRECTOR
說明:若是沒有出現輪詢,說明是在緩存中響應,可使用以下方法不記錄緩存
if (req.url ~ "/index.html") { #能夠對指定目錄設置不記錄緩存 return(pass); }
cache-worker線程:緩存線程
cache-main線程:主線程此線程只有一個,用於啓動caceh
ban luker:緩存清理
acceptor:接收用戶請求
epoll:線程池管理器
expire:清理過時緩存
varnish定義其最大併發鏈接數:線程池模型:
thread_pools:線程池個數;默認爲2;
thread_pool_max:單線程池內容許啓動的最多線程個數;
thread_pool_min:單線程池內容許啓動的最少線程個數;
thread_pool_timeout:多於thread_pool_min的線程空閒此參數指定的時長後即被purge;
varnish的param查看及改變:
param.show[-l] [param]
param.set[param] [value]
varnishtop: 內存日誌區域查看工具
一次訪問查看以下所示:
查看到的日誌:
RxHeader User-Agent: Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81Safari/537.36
其中:
RxHeader:稱爲tag, 基於tag過濾,可以使用-i或-x選項;
User-Agent起始的內容:稱爲日誌信息,可以使用-I或-X選項進行過濾;
-Iregexp: 僅顯示被模式匹配到的條目
-Xregexp:僅顯示不被模式匹配到的條目
-C:忽略字符大小寫;
-d:顯示已有日誌;
-ffield, field, ... #查看指定字段
-l:列出全部可用字段
-x:xml輸出格式
-j:json輸出格式
varnishlog一次顯示以下所示: