varnish 緩存服務器配置與使用
一、cache
1.緩存為什么會存在?
一個快的設備要想和慢的設備交互,只有一種辦法就是讓快的設備工作在慢的設備的頻段上!這樣的話就浪費了,我們可以在兩者之間加上一個加速器,這個加速器就叫做緩存!
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取并送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取并送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以后對整塊數據的讀取都從Cache中進行,不必再調用內存。cpu的緩存分為三個等級,L1級別頻率最接近cpu性能,后次之!
程序的運行具有局部性特征:
時間局部性
空間局部性
cache:命中
熱區:局部性;
時效性:
緩存空間耗盡:LRU(最近最少使用算法清理)
過期:緩存清理
緩存命中率:命中次數
/
(命中次數
+miss
)
在此區間(0,1)
頁面命中率:基于頁面數量進行衡量
字節命中率:基于頁面的體積進行衡量
緩存與否:
私有數據:private,private cache;
公共數據:public, public or private cache;
2.Web的緩存
3.web高速緩存相關的頭字段
最重要的緩存頭字段有:
- Expires:過期時間;
Expires:Thu, 22 Oct 2026 06:34:30 GMT
- Cache-Control
- Etag
- Last-Modified
- If-Modified-Since
- If-None-Match
- Vary:值
- Age:已緩存時間
4.緩存有效性判斷機制:
用戶訪問緩存,緩存的內容是否過期,沒過期返回用戶緩存的內容。另一種就是即便沒過期也要就去請求后端主機如果后端主機的內容沒發生改變(基于元數據的時間戳驗證或 Etag)返回緩存服務器(304)校驗碼,然后緩存(若過期就再續期)并發送緩存上的內容到客戶,如果后端內容發生改變就發送新的內容到緩存服務器,服務器經過判斷是否進行緩存,相應給用戶。(條件式請求 )
過期時間:Expires
HTTP/1.0
Expires
HTTP/1.1
Cache-Control: maxage=
Cache-Control: s-maxage=
條件式請求:
Last-Modified/If-Modified-Since (時間戳驗證)
Etag/If-None-Match (Etag 驗證)
Expires:Thu, 13 Aug 2026 02:05:12 GMT
Cache-Control:max-age=315360000
ETag:"1ec5-502264e2ae4c0"
Last-Modified:Wed, 03 Sep 2014 10:00:27 GMT
緩存控制
cache-request-directive =
"no-cache"
| "no-store" //不要緩存的實體,要求現在從WEB服務器去取
| "max-age" "=" delta-seconds #最大緩存時長
| "max-stale" [ "=" delta-seconds ] //可以接受過去的對象,但是過期時間必須小于 max-stale 值
| "min-fresh" "=" delta-seconds //接受其新鮮生命期大于其當前 Age 跟 min-fresh 值之和的緩存對象
| "no-transform"
| "only-if-cached" //只有當緩存中有副本時,客戶端才會獲取一份副本
| cache-extension
cache-response-directive =
"public" //可以用 Cached 內容回應任何用戶
| "private" [ "=" <"> 1#field-name <"> ] //只能用緩存內容回應先前請求該內容的那個用戶
| "no-cache" [ "=" <"> 1#field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| cache-extension
緩存相關的HTTP首部
HTTP協議提供了多個首部用以實現頁面緩存及緩存失效的相關功能,這其中最常用的有:
(1)Expires:用于指定某web對象的過期日期/時間,通常為GMT格式;一般不應該將此設定的未來過長的時間,一年的長度對大多場景來說足矣;其常用于為純靜態內容如JavaScripts樣式表或圖片指定緩存周期;
(2)Cache-Control:用于定義所有的緩存機制都必須遵循的緩存指示,這些指示是一些特定的指令,包括public、private、no-cache(表示可以存儲,但在重新驗正其有效性之前不能用于響應客戶端請求)、no-store、max-age、s-maxage以及must-revalidate等;Cache-Control中設定的時間會覆蓋Expires中指定的時間;
(3)Etag:響應首部,用于在響應報文中為某web資源定義版本標識符;
(4)Last-Mofified:響應首部,用于回應客戶端關于Last-Modified-Since或If-None-Match首部的請求,以通知客戶端其請求的web對象最近的修改時間;
(5)If-Modified-Since:條件式請求首部,如果在此首部指定的時間后其請求的web內容發生了更改,則服務器響應更改后的內容,否則,則響應304(not modified);
(6)If-None-Match:條件式請求首部;web服務器為某web內容定義了Etag首部,客戶端請求時能獲取并保存這個首部的值(即標簽);而后在后續的請求中會通過If-None-Match首部附加其認可的標簽列表并讓服務器端檢驗其原始內容是否有可以與此列表中的某標簽匹配的標簽;如果有,則響應304,否則,則返回原始內容;
(7)Vary:響應首部,原始服務器根據請求來源的不同響應的可能會有所不同的首部,最常用的是Vary: Accept-Encoding,用于通知緩存機制其內容看起來可能不同于用戶請求時Accept-Encoding-header首部標識的編碼格式;
(8)Age:緩存服務器可以發送的一個額外的響應首部,用于指定響應的有效期限;瀏覽器通常根據此首部決定內容的緩存時長;如果響應報文首部還使用了max-age指令,那么緩存的有效時長為“max-age減去Age”的結果;
開源解決方案:
squid:但是穩定
varnish:較新
二、varnsh:簡介
Varnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙 Verdens Gang 使用3臺Varnish代替了原來的12臺Squid,性能比以前更好。
1、varnish官方站點:
http://www.varnish-cache.org/
Community:社區版
Enterprise:企業版
2、架構
varnish主要運行兩個進程:Management進程和Child進程(也叫Cache進程)。
Manager進程 主要實現應用新的配置、編譯VCL、監控varnish、初始化varnish以及提供一個命令行接口等。Management進程會每隔一段時間探測一下Child進程以判斷其是否正常運行,如果在指定的時長內未得到Child進程的回應,Mangagement將會重啟此Child進程。
Cacher進程,包含多種類型的線程:
accept:接受新的連接請求并響應
worker:child進程會為每個用戶啟動一個worker進程,因此,在高并發的場景中可能會出現數百個worker進程甚至更多
expiry:從緩存中清理過期內容
varnish日志 varnishncsa.service
為了與系統的其他部分進行交互,Child進程使用了可以通過文件系統接口進行訪問的共享內存日志(shared memory log),因此,如果某線程需要記錄信息,其僅需要持有一個鎖,而后向共享內存中的某內存區域寫入數據,再釋放持有的鎖即可。而為了減少競爭,每個worker線程都使用了日志數據緩存
共享內存大小一般為90M,其分為兩部分,前一部分為計數器,后半部分為客戶端請求的數據。varnish通過了多個不同的工具,如varnishlog、varnishncsa或varnishstst等來分析共享內存日志中的信息并能夠以指定的方式進行顯示
shared memory log:
統計數據:計數器;
日志區域:日志記錄;
varnishlog, varnishncsa, varnishstat...
配置接口:VCL
Varnish Configuration Language,
vcl complier --> c complier --> shared object
varnish的后端存儲
varnish支持多種不同類型的后端存儲。這可以在varnish啟動時使用-s選項指定。后端存儲的類型包括
· malloc[,size]
內存存儲,[,size]用于定義空間大小;重啟后所有緩存項失效;
· file[,path[,size[,granularity]]]
文件存儲,黑盒;重啟后所有緩存項失效;
· persistent,path,size
文件存儲,黑盒;重啟后所有緩存項有效;實驗;
varnish無法追蹤某緩存對象是否存入了緩存文件,而后也就無法得知磁盤上的緩存文件是否可用,因此,file存儲在varnish停止
或重啟
是會清除數據
。而persistent方法的出現對此有一個彌補,但persistent仍處于測試階段
三、varnish的程序環境:
0.安裝
1、配置文件
/etc/varnish/varnish.params: 配置varnish服務進程的工作特性,例如監聽的地址和端口,緩存機制;程序選項,運行時參數設定!
/etc/varnish/default.vcl:配置各Child/Cache線程的工作屬性;
2、主程序:
/usr/sbin/varnishd
監聽端口:
面向客戶端,nginx后邊的那一端監聽在 6081,而不是80端口!varnishadm管理控制端口是6082!盡量監聽在127.0.0.1 網段的接口,通過秘鑰文件使兩者相連接
CLI interface:
/usr/bin/varnishadm
Shared Memory Log交互工具:
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
測試工具程序:
/usr/bin/varnishtest
VCL配置文件重載程序:
/usr/sbin/varnish_reload_vcl
Systemd Unit File:
/usr/lib/systemd/system/varnish.service
varnish服務
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
日志持久的服務;
四、varnish命令
1、程序選項:/etc/varnish/varnish.params文件
-a address[:port][,address[:port][...],自己監聽的端口,本機所有的地址默認為6081端口;
-P file Varnish進程PID文件存放路徑
-p param=value 指定服務器參數,用來優化varnish性能
-T address[:port],設定varnish的telnet管理地址及其端口;默認為6082端口;
-s [name=]type[,options],定義緩存存儲機制;常用的方式有:“-s file,<dir_or_file>,<size>”
-S :加載的密鑰文件
-u user
-g group
-c :僅編譯,測試用
-f config:VCL配置文件;指定varnish服務器的配置文件
-F:運行于前臺;
-w int[,int[,int]] 設定varnish的工作線程數,常用的方式有:
-w min,max
-w min,max,timeout
例如:-w5,51200,30,這里需要說明下,在varnish2.0版本以后,最小啟動的線程數不能設定過大,設置過大,會導致varnish運行異常緩慢。
...
運行時參數(可以在運行時修改):/etc/varnish/varnish.params
文件,
DEAMON_OPTS
DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
-p param=value:設定運行參數及其值; 可重復使用多次;
-r param[,param...]: 設定指定的參數為只讀狀態;
重載vcl配置文件:
~ ]# varnish_reload_vcl
測試啟動:流程
更改配置文件,配置httpd主機,啟動。
修改配置文件僅開放本地主機登錄varnish端口
varnish主機(10.1.6.72)
加載配置文件
后端httpd主機(10.1.6.172)
訪問
五、varnishadm(手動控制varnish命令)
-S /etc/varnish/secret -T [ADDRESS:]PORT
(-S 指明連接時用的密鑰 -T 指明地址和端口 6082)
help [<command>]:#獲取命令的使用幫助
ping [<timestamp>]:#探測服務是否OK
auth <response>:#認證
quit:#退出
banner:#顯示信息
status:#顯示當前服務的狀態
start:#啟動子進程一般用于啟動varnishd
stop:#關閉varnishd
vcl.load <configname> <filename>:手動裝載配置文件,(要先起個名)
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>:#指明使用哪個版本
vcl.discard <configname>:#刪除指定版本
vcl.list :#列出已經編譯成功vcl版本,(每寫一次就會編譯一個版本)
param.show [-l] [<param>]
param.set <param> <value> #:設置變量對應的值
panic.show
panic.clear
storage.list #:當前用的存儲機制
vcl.show [-v] <configname>
backend.list [<backend_expression>] #列出后端服務器
backend.set_health <backend_expression> <state> :#定義后端服務器的健康狀態監測
ban <field> <operator> <arg> [&& <field> <oper> <arg>]... #手動清理緩存
ban.list
1.vcl配置文件相關:
vcl.list
vcl.load:裝載,加載并編譯;
vcl.use:激活;
vcl.discard:刪除;
vcl.show [-v] <configname>:查看指定的配置文件的詳細信息;
2.運行時參數:
param.show -l:顯示列表;
param.show <PARAM>
param.set <PARAM> <VALUE>
3、緩存存儲:
storage.list
4、后端服務器:
backend.list
六 、VCL
Varnish Configuration Language,縮寫為VCL,即Varnish配置語言,它提供了一種控制Varnish工作的接口,使用該語言配置緩存的處理策略,然后通過管理進程將其解釋為C代碼,然后使用C編譯器編譯后,鏈接至正在運行的Varnish實例。C 語言特點
VCL策略在啟用前,會由management進程將其轉換為C代碼,而后再有gcc編譯器將C代碼編譯成二進制程序。編譯完成后,management負責將其連接至varnish實例,即Child進程。正式由于編譯工作在child進程之外完成,它避免了轉載錯誤格式VCL的風險,因此,varnish修改配置的開銷非常小,其可以同時保有幾分尚在引用的舊版本配置,也能夠讓新的配置即刻生效,編譯后的舊版本配置通常在varnish重啟時才會被丟棄,如果需要手動清理,則可以使用varnishadm的vcl.discard命令來完成
1、老一點版本的流程圖
2、新版本的流程圖varnish 4.X
亮色的為狀態引擎
灰色框的為后端服務器上的操作
VCL函數
3、state engine:狀態引擎切換機制
VCL有多個狀態引擎,狀態之間存在相關性,但彼此間互相隔離;每個狀態引擎可使用return(x)指明關聯至哪個下一級引擎; vcl_hash –> return(hit) –> vcl_hit
request: vcl_recv
response: vcl_deliver
- (1) vcl_hash -(hit)-> vcl_hit –> vcl_deliver
- (2) vcl_hash -(miss)-> vcl_miss –> vcl_backend_fetch –> vcl_backend_response –> vcl_deliver
- (3) vcl_hash -(purge)-> vcl_purge –> vcl_synth
- (4) vcl_hash -(pipe)-> vcl_pipe
兩個特殊的引擎:
vcl_init:在處理任何請求之前要執行的vcl代碼:主要用于初始化VMODs;
vcl_fini:所有的請求都已經結束,在vcl配置被丟棄時調用;主要用于清理VMODs;
vcl的語法格式:
(1) VCL files start with vcl 4.0;
(2) //, # and /* foo */ for comments;
(3) Subroutines are declared with the sub keyword(子例程要用sub 當關鍵字); 例如sub vcl_recv { ...};
(4) No loops, state-limited variables(受限于引擎的內建變量);
(5) 使用keyword函數和return的返回值來終止當前狀態引擎,并交給下一個引擎
(6) Domain-specific;域專用的配置
vcl有限狀態機
1.每一個引擎都是被單獨處理的
2、每個請求之間都是獨立的
3、狀態引擎有相關性,但是相互隔離
4、狀態引擎之間相互轉換用return實現
5、配置文件中寫的雖然都是注釋的,但是有默認配置!自己的配置會默認放在最前邊!
七、vcl語法,及控制編寫(.vcl文件的編寫)
1、基本語法
sub subroutine {
...
}
if CONDITION {
...
} else {
...
}
return(), hash_data()
2、VCL Built-in Functions and Keywords
函數:
regsub(str, regex, sub) #替換函數
regsuball(str, regex, sub) #全局所有都替換函數
ban(boolean expression)
hash_data(input)
synthetic(str)
VCL提供了幾個函數來實現字符串的修改,添加bans,重啟VCL狀態引擎以及將控制權轉回Varnish等。
regsub(str,regex,sub)
regsuball(str,regex,sub):這兩個用于基于正則表達式搜索指定的字符串并將其替換為指定的字符串;但regsuball()可以將str中能夠被regex匹配到的字符串統統替換為sub,regsub()只替換一次;
ban(expression):
ban_url(regex):Bans所有其URL能夠由regex匹配的緩存對象;
purge:從緩存中挑選出某對象以及其相關變種一并刪除,這可以通過HTTP協議的PURGE方法完成;
hash_data(str):
return():當某VCL域運行結束時將控制權返回給Varnish,并指示Varnish如何進行后續的動作;其可以返回的指令包括:lookup、pass、pipe、hit_for_pass、fetch、deliver和hash等;但某特定域可能僅能返回某些特定的指令,而非前面列出的全部指令;
return(restart):重新運行整個VCL,即重新從vcl_recv開始進行處理;每一次重啟都會增加req.restarts變量中的值,而max_restarts參數則用于限定最大重啟次數。
Keywords:關鍵字
call subroutine, return(action),new,set,unset
操作符:
==, !=, ~, >, >=, <, <=
邏輯操作符:&&, ||, !
變量賦值:=
+ 兩邊是字符串的話表示連接
舉例:obj.hits
if (obj.hits>0) {
set resp.http.X-Cache = "HIT via " + server.ip; #在相應報文中加一個首部為X-Cache = “HiT via ” 再加上服務器ip地址
} else {
set resp.http.X-Cache = "MISS via " + server.ip;
}
應用在deliver中,這樣就能在相應報文中看到
2、變量類型:
內建變量:
req.*:request,表示由客戶端發來的請求報文相關;
req.http.*
req.http.User-Agent, req.http.Referer, ...
bereq.*:由varnish發往BE主機的httpd請求相關;
bereq.http.*
beresp.*:由BE主機響應給varnish的響應報文相關;
beresp.http.*
resp.*:由varnish響應給client相關;
obj.*:存儲在緩存空間中的緩存對象的屬性;只讀;
3、常用變量:
bereq和resp上的是可以控制的
bereq.*, req.*:
bereq.http.HEADERS*:請求報文的某指定首部
bereq.request:請求方法;
bereq.url:請求服務器的url;
req.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
用戶自定義:
set
unset
示例1:強制對某類資源的請求不檢查緩存:
vcl_recv {
if (req.url ~ "(?i)^/(login|admin)") {
#請求的url做正則匹配(?i)標志位表示不區分正則表達式的大小寫,真正匹配的模式在`)`后邊
return(pass);
}
}
示例2:對于特定類型的資源,例如公開的圖片等,取消其私有標識,并強行設定其可以由varnish緩存的時長;
sub vcl_backend_response {
if (beresp.http.cache-control !~ "s-maxage") {
#如果請求的首部不是 s-maxage
if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$") {
unset beresp.http.Set-Cookie;
#表示撤銷響應報文
set beresp.ttl = 3600s;
#設定緩存時間
}
}
}
4. 緩存對象的修剪:purge, ban
(1) 能執行purge操作
sub vcl_purge {
return (synth(200,"Purged"));
}
(2) 何時執行purge操作
sub vcl_recv {
if (req.method == "PURGE") {
return(purge);
}
...
}
這些就是當請求的方法為 ‘PURGE’就發到后端清理緩存。
可以用 curl 命令指定方法請求 -I -X PURGE 來請求
添加此類請求的訪問控制法則:
一下這個要放在 vcl 4.0;之下,最好在backend之下一行 定義
acl purgers {
"127.0.0.0"/8;
"10.1.0.0"/16; #注意看清楚只能地址在“”內
}
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return(synth(405,"Purging not allowed for " + client.ip));
}
return(purge);
}
...
}
修改配置文件
加載
使用別的網段請求清理
發現清理不掉,這里用本地10.0網段的來清理也是清理不掉
換127網段的來清理,可以清理掉
但是這種清理只針對本地的127網段
因為varnish的緩存是靠url來定義的,一下默認配置段可以看出
所以要想清理遠程主機訪問的緩存記錄,就要先授權一個地址能訪問 例授權一個本地主機的地址
這樣本地主機就用正常訪問的來清理
就好了
這段代碼標明:限制那些用戶對varnish服務器做purge請求,這里定義了一個函數用來做acl限制。
八、如何設定使用多個后端主機:
1.先定義主機
backend default {
.host = "172.16.100.6";
.port = "80";
}
backend appsrv {
.host = "172.16.100.7";
.port = "80";
}
2、基于什么方式調用
sub vcl_recv {
if (req.url ~ "(?i)\.php$") {
set req.backend_hint = appsrv;
} else {
set req.backend_hint = default;
}
...
}
#這里就表示 如果請求的是.php結尾的文件就用appsrv這個后端主機去相應,。。。。。
3、基于負載均衡調度 后端多個主機:需要使用模塊
varnish module
使用前需要導入:
import director;
示例:
import directors; # 導入模塊
backend server1 {
.host =
.port =
}
backend server2 {
.host =
.port =
}
#初始化
sub vcl_init {
new GROUP_NAME = directors.round_robin(); #新建一個組 = 組名.調度方法
GROUP_NAME.add_backend(server1);
GROUP_NAME.add_backend(server2);
}
sub vcl_recv {
# send all traffic to the bar director:
set req.backend_hint = GROUP_NAME.backend(); #調用時調用組名
}
不過這樣只能針對不緩存的,也就是說第一次如果請求調度了a主機就直接被緩存下來不會再向后請求了,會以a主機的內容進行相應,不會去訪問b主機。但如果針對后端主機進行訪問(不緩存的內容),這樣才會被輪詢調度。
例:
九、varnish對后端主機的健康狀態監測
如果檢查失敗就不會再往那臺主機調度。這就是監測機制
默認定義后會自動進行檢測
查看后端主機狀況 在varnishadm
backend.list
手動指定后端某個主機處于不健康狀態(是管理方式的設定,一旦設定就永久為這個狀態,不建議)
backend.set_health <定義的主機名> sick (不健康的) | Healthy (健康的)
BE Health Check:格式
backend BE_NAME { #定義后端主機
.host = #后端主機的地址
.port = #后端主機的端口
.probe = { #定義檢查機制
.url= #對url檢查
.timeout= #超時時間
.interval= #每隔多長時間檢查一次
.window= #基于最近多少次的請求來判定
.threshhold= #最近.window中定義的這么次檢查中至有.threshhold定義的次數是成功的;
}
}
.probe:定義健康狀態檢測方法;
.url:檢測時請求的URL,默認為”/";
.request:發出的具體請求;
.request =
"GET /.healthtest.html HTTP/1.1"
"Host: www.magedu.com"
"Connection: close"
.window:基于最近的多少次檢查來判斷其健康狀態;
.threshhold:最近.window中定義的這么次檢查中至有.threshhold定義的次數是成功的;
.interval:檢測頻度;
.timeout:超時時長;
.expected_response:期望的響應碼,默認為200;
健康狀態檢測的配置方式:
(1)單獨定義
probe PB_NAME = { }
backend NAME = {
.probe = PB_NAME;
...
}
(2) 直接在調用主機時定義
backend NAME {
.probe = {
...
}
}
示例:
probe check {
.url = "/.healthcheck.html"; #對此網頁進行檢查
.window = 5; #對近5次
.threshold = 4; #5次中有四次成功
.interval = 2s; #要加s(秒);每次檢查的頻率為2s
.timeout = 1s; #要加s(秒);請求時的超時時間1s
}
backend default {
.host = "10.1.0.68";
.port = "80";
.probe = check; #調用檢查
}
backend appsrv {
.host = "10.1.0.69";
.port = "80";
.probe = check;
}
十、varnish的運行參數
1.線程模型:
cache-worker #處理用戶請求
cache-main #
ban lurker #清理緩存項
acceptor: #接受用戶請求
epoll/kqueue: #
...
線程相關的參數:
最大并發連接數=thread_pools * thread_pool_max
在線程池內部,其每一個請求由一個線程來處理; 其worker線程的最大數決定了varnish的并發響應能力;
thread_pools:線程池; 最好小于或等于CPU核心數量; (和nginx 的work進程類似)
thread_pool_max: 每個線程池當中的線程數量(work)每個線程處理一個用戶請求
thread_pool_min:每個線程池中最小工作線程數量. 額外意義為“最大空閑線程數”;
thread_pool_timeout:線程空閑閾值。(線程的線程池,至少已經閑置了這么長時間,才會被摧毀。)
thread_pool_add_delay:在需要創建一個線程之前等待時間(因為如果直接創建時間會很慢,在這個時間內可能會有空閑線程被騰出)
thread_pool_destroy_delay:清理線程池的線程所前要等待的時間
設置方式:
vcl.param
例:查看某個線程相關的參數
設定參數
永久有效的方法:
編輯/etc/varnish/varnish.params
DEAMON_OPTS="-p PARAM1=VALUE -p PARAM2=VALUE"
十一、varnish日志區域:(默認大小90M)
shared memory log
計數器
日志信息
1、varnishstat
命令- Varnish 狀態信息
-1 顯示有多少種狀態字段信息
-1 -f FILED_NAME #顯示你指定的字段的信息
-l:可用于-f選項指定的字段名稱列表;
不加-1只加-f的話就會動態顯示指定字段,-1表示列出意思
我們一般關注
- MAIN.cache_hit :命中次數
- MAIN.cache_miss :未命中次數
~]# varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss
2、varnishtop
– Varnish 日志中各項的參數記錄的排序(首部)
-1 靜態的列出
-i taglist,可以同時使用多個-i選項,也可以一個選項跟上多個標簽;
-I <[taglist:]regex> #基于正則表達式匹配匹配首部的值;可以有多個(-I .. -I..)
-x taglist:排除列表(不包含)
-X <[taglist]:regex> #基于正則表達式匹配
-C 持續顯示
例:查找在 ReqHeader 首部中包含User-Agent的內容,持續顯示
varnishtop -C -I ReqHeader:User-Agent
3、varnishlog
單獨記錄每次請求的日志信息;按批次記錄
*4、 varnishncsa
正常模式下的日志顯示,常用
-a 追加日志
-f 自定義格式
持續記錄日志
systemct start varnishncsa.service
日志保存位置:
/var/log/varnish/varnishncsa.log
內建函數:
hash_data():指明哈希計算的數據;減少差異,以提升命中率;
regsub(str,regex,sub):把str中被regex第一次匹配到字符串替換為sub;主要用于URL Rewrite
regsuball(str,regex,sub):把str中被regex每一次匹配到字符串均替換為sub;
return():
ban(expression)
ban_url(regex):Bans所有的其URL可以被此處的regex匹配到的緩存對象;
synth(status,"STRING"):purge操作;
總結:
varnish: 狀態引擎, vcl
varnish 4.0:
vcl_init :定義服務器組
vcl_recv :剛收到用戶請求時動作可以再此內容定義
vcl_hash :哈希用戶請求的url等數據來查緩存
vcl_hit :命中后的工作
vcl_pass :不查緩存
vcl_miss :沒有命中
vcl_pipe :不通過緩存,直接和后端建立管道
vcl_waiting :繁忙狀態等待
vcl_purge :清理緩存
vcl_deliver :結果投遞
vcl_synth :合成相應報文
vcl_fini :清理init定義的內容時用到
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
sub VCL_STATE_ENGINE #定義狀態引擎
backend BE_NAME {} #定義后端主機
probe PB_NAME {} #健康狀態監測機制
acl ACL_NAME {} #訪問控制列表
其他
如果一個varnish不足以給整個網站的規模提供緩存空間,就要再加一臺varnish主機,這時就要有調度。
注意: 要考慮緩存命中率問題,可以用url的hash進行調度,要用一致性哈希算法進行調度
原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/59106