Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

52.4. Varnish Configuration Language - VCL

Varnish配置檔案VCL中的函數詳解


		

內置的常式

vcl_recv
有請求到達後成功接收並分析時被調用,一般以以下幾個關鍵字結束。
error code [reason] 返回code給客戶端,並放棄處理該請求
pass 進入pass模式,把控制權交給vcl_pass
pipe 進入pipe模式,把控制權交給vcl_pipe
lookup 在緩存裡查找被請求的對象,根據查找結果把控制權交給vcl_hit或vcl_miss

vcl_pipe
進入pipe模式時被調用。請求被直接發送到backend,後端和客戶端之間的後繼數據不進行處理,只是簡單傳遞,直到一方關閉連接。一般以以下幾個關鍵字結束。
error code [reason]
pipe

vcl_pass
進入pass模式時被調用。請求被送到後端,後端應答數據送給客戶端,但不進入緩存。同一連接的後繼請求正常處理。一般以以下幾個關鍵字結束。
error code [reason]
pass

vcl_hash
目前不使用

vcl_hit
在lookup以後如果在cache中找到請求的內容事調用。一般以以下幾個關鍵字結束。
error code [reason]
pass
deliver 將找到的內容發送給客戶端,把控制權交給vcl_deliver.

vcl_miss
lookup後但沒有找到緩存內容時調用,可以用於判斷是否需要從後端伺服器取內容。一般以以下幾個關鍵字結束。
error code [reason]
pass
fetch 從後端取得請求的內容,把控制權交給vcl_fetch.


vcl_fetch
從後端取得內容後調用。一般以以下幾個關鍵字結束。
error code [reason]
pass
insert 將取到的內容插入緩存,然後發送給客戶端,把控制權交給vcl_deliver


vcl_deliver
緩存內容發動給客戶端前調用。一般以以下幾個關鍵字結束。
error code [reason]
deliver 內容發送給客戶端

vcl_timeout
在緩存內容到期前調用。一般以以下幾個關鍵字結束。
fetch 從後端取得該內容
discard 丟棄該內容



vcl_discard
由於到期或者空間不足而丟棄緩存內容時調用。一般以以下幾個關鍵字結束。
discard 丟棄
keep 繼續保留在緩存裡

如果這些內置常式沒有被定義,則執行預設動作


一些內置的變數
now 當前時間,標準時間點(1970?)到現在的秒數

backend.host 後端的IP或主機名
backend.port 後端的服務名或連接埠

請求到達後有效的變數
client.ip 客戶端IP
server.ip 服務端IP
req.request 請求類型,比如GET或者HEAD或者POST
req.url 請求的URL
req.proto 請求的HTTP版本號
req.backend 請求對應的後端
req.http.header 對應的HTTP頭

往後段的請求時有效的變數
bereq.request 比如GET或HEAD
bereq.url URL
bereq.proto 協議版本
bereq.http.header HTTP頭

從cache或後端取到內容後有效的變數
obj.proto HTTP協議版本
obj.status HTTP狀態代碼
obj.response HTTP狀態信息
obj.valid 是否有效的HTTP應答
obj.cacheable 是否可以緩存的內容,也就是說如果HTTP返回是200、203、300、301、302、404、410並且有非0的生存期,則為可緩存
obj.ttl 生存期,秒
obj.lastuse 上一次請求到現在間隔秒數

對客戶端應答時有效的變數
resp.proto response的HTTP版本
resp.status 回給客戶端的HTTP狀態代碼
resp.response 回給客戶端的HTTP狀態信息
resp.http.header HTTP頭
		

52.4.1. unset / set

 sub vcl_deliver {
##### Remove some headers
    unset resp.http.Server;
    unset resp.http.X-Powered-By;
    unset resp.http.X-Varnish;
    unset resp.http.Via;
###
	if (obj.hits > 0){
		set resp.http.X-Cache = "cdn cache server v2.0";
	}else{
		set resp.http.X-Cache = "MISS ";
	}
	return (deliver);
}