varnish pipe 和pass的區別分析

這兩天在學習varnish,在學到vcl時,不理解pipe和pass的區別以及如何區分加以應用。經過兩天的搜索,總算是理清了概念。如今記錄在博客上跟你們分享。css

  當 vcl_recv 函數接收到請求時,它要判斷如何處理這個請求。有三種狀況 :html

 

調用 pass 函數,從後端服務器調用數據。  調用 pipe 函數,創建客戶端和後端服務器之間的直接鏈接,從後端服務器調用數據。  調用lookup函數,從緩存中查找應答數據並返回,若是查找不到,則調用pass函數從後端服務器調用數據 。

 

在這裏,我就有幾個疑惑:後端

pass和pipe都從後端服務器取數據,它們之間有什麼不一樣呢?  什麼狀況下用pass,什麼狀況下用pipe呢?  什麼樣的數據會被緩存在varnish中呢?

在理解這幾個問題前,須要先理解另一些概念:瀏覽器

 

http 創建鏈接的過程   http 請求的類型:get post head

先說http創建鏈接的過程(我只寫下大概,由於不是本文的重心,具體的請另外上網查):緩存

 

當瀏覽器想要得到一個網頁內容時,如在瀏覽器輸入www.google.com。  這時瀏覽器開始跟服務器創建鏈接,先執行三次握手,確認創建鏈接。  以後瀏覽器會發送請求,一個網頁包含多個內容,如圖片,正文,html代碼,css代碼,js代碼。若是在html 1.0版本中,請求一個文件是須要創建一次鏈接的,多個請求多個鏈接。開銷是很大的。而在HTML 1.1中,具備了長鏈接的特性,容許在keep-live 時間內保持鏈接,在這段時間內無須再創建鏈接就能夠發送多個請求。  請求完成 或 keep-live時間到限,鏈接斷開。

HTTP 請求的類型:服務器

 

HTTP 請求的類型有幾種,下面是主要的幾種:   GET : 請求指定的頁面信息,並返回實體主體。  HEAD: 只請求頁面的首部。  POST: 請求服務器接受所指定的文檔做爲對所標識的URI的新的從屬實體。

說白了,請求一個靜態的HTML頁面就是用get類型,而若是你在新浪微博上發一條微博,其實就是post 類型。cookie

總結來講,get是請求相關URI並接受服務器的返回數據。爲了接收數據。ide

post是發送數據給服務器,服務器須要對這些數據作相應的處理。爲了發送數據。函數

 

以上都明白的話,就能夠解答這三個問題了:post

 

pass和pipe都從後端服務器取數據,它們之間有什麼不一樣呢?    什麼狀況下用pass,什麼狀況下用pipe呢?    什麼樣的數據會被緩存在varnish中呢?

 

問:pass和pipe都從後端服務器取數據,它們之間有什麼不一樣呢?  答:當vcl_recv調用 pass 函數時,pass將當前請求直接轉發到後端服務器。然後續的請求仍然經過varnish處理。 例如,創建了HTTP鏈接以後,客戶端順序請求 a.css 、a.png兩個文件,「當前請求」指的是第一個請求,即a.css,a.css被直接轉發到後端服務器,不被緩存。然後續的a.png則再由varnish來作處理,varnish會判斷a.png 如何處理。 總結:一個鏈接中除了當前請求,其它請求仍然按照正常狀況由varnish處理。  而pipe模式則不同,當vcl_recv判斷 須要調用 pipe 函數時,varnish會在客戶端和服務器之間創建一條直接的鏈接 ,以後客戶端的全部請求都直接發送給服務器,繞過varnish,再也不由varnish檢查請求,直到鏈接斷開。

 

什麼狀況下用pass,什麼狀況下用pipe呢?  答:pass 一般只處理靜態頁面。即只在GET 和 HEAD 類型的請求中時才適合調用pass函數。另外,須要注意的一點是,pass模式不能處理POST請求,爲何呢?由於POST請求通常是發送數據給服務器,須要服務器接收數據,並處理數據,反饋數據 。是動態的,不做緩存。 示例代碼以下: if (req.request !="GET" && req.request != "HEAD") {               return (pipe);       }       那什麼狀況下用pipe?由以上陳述能夠知,類型是POST時用pipe,可是也許還不太清晰。舉個例子,當客戶端在請求一個視頻文件時,或者一個大的文檔,如.zip .tar 文件,就須要用pipe模式,這些大的文件是不被緩存在varnish中的。

 

什麼樣的數據會被緩存在varnish中呢?   答:varnish只緩存靜態數據。在網上搜到的varnish緩存策略,能夠解答這個問題: varnish緩存策略  缺省是根椐後端返回的http狀態碼決定是否緩存。能夠緩存的狀態碼以下: 200    203    300    301    302    410    404     varnish如今還不支持ranges請求,因此不會緩存206狀態的結果。  管理員能夠在vcl的配置文件中的vcl_fetch部分,加入自已的緩存策略,方法是修改beresp.cacheable變量。下面的例子,看後端返回中若是設置了cookie,則不緩存:  sub fetch {      if (beresp.http.Set-Cookie) {         set beresp.cacheable = false;     } } 參考文章:http://blog.sina.com.cn/s/blog_5374d6e30100tupo.html
相關文章
相關標籤/搜索