知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
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頭
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); }