varnish pipe 和pass的區別分析

2022-07-29 12:45:08 字數 2715 閱讀 7638

這兩天在學習varnish,在學到vcl時,不理解pipe和pass的區別以及如何區分加以應用。通過兩天的搜尋,總算是理清了概念。現在記錄在部落格上跟大家分享。

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

呼叫 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的新的從屬實體。 

總結來說,get是請求相關uri並接受伺服器的返回資料。為了接收資料。

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") 

那什麼情況下用pipe?由以上陳述可以知,型別是post時用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  

} 參考文章: 

文章末尾總結:學技術不要死扣中文文件,多看英文文件會比較有幫助 。

本文出自 「yeelonⓖ 」 部落格,請務必保留此出處

varnish pipe 和pass的區別分析

這兩天在學習varnish,在學到vcl時,不理解pipe和pass的區別以及如何區分加以應用。通過兩天的搜尋,總算是理清了概念。現在記錄在部落格上跟大家分享。當 vcl recv 函式接收到請求時,它要判斷如何處理這個請求。有三種情況 呼叫 pass 函式,從後端伺服器呼叫資料。呼叫 pipe 函...

varnish pipe 和pass的區別分析

這兩天在學習varnish,在學到vcl時,不理解pipe和pass的區別以及如何區分加以應用。通過兩天的搜尋,總算是理清了概念。現在記錄在部落格上跟大家分享。當 vcl recv 函式接收到請求時,它要判斷如何處理這個請求。有三種情況 呼叫pass函式,從後端伺服器呼叫資料。呼叫pipe函式,建立...

ftp中主動模式 port 與被動模式 PASV

ftp是僅基於tcp的服務,不支援udp。與眾不同的是ftp使用2個埠,乙個資料埠和乙個命令埠 也可叫做控制埠 通常來說這兩個埠是21 命令埠和20 資料埠。但當我們發現根據 ftp工作 方式的不同資料埠並不總是20時,混亂產生了。主動方式的ftp是這樣的 客戶端從乙個任意的非特權埠n n 1024...