2015-08-20 30 views
2

我正在工作varnish configuration I didn't write,並且此配置似乎可以互換使用(pass)(pipe)。我有點不清楚這兩個行爲之間的區別。清漆`(管道)`和`(通過)'之間的區別

(pipe)手動部分是一個有點神祕給我

管可從vcl_recv也被退回。管道將客戶端和後端連接短路,並且Varnish將會坐在那裏並來回拖動字節。 Varnish不會查看來回發送的數據 - 因此您的日誌將不完整。請注意,使用HTTP 1.1,客戶端可以在同一個連接上發送多個請求,因此您應該指示Varnish在實際返回管道之前添加「Connection:close」標頭。

我不確定當他們說「短路」時,他們在說什麼客戶端,或者在這種情況下什麼短路意味着什麼,或者清漆如何來回移動字節與正常行爲不同。即對於瞭解清漆實現的人來說,這個描述可能是很好的,但對於將清漆的角色理解爲「從內存中抽取HTTP請求的結果,或者從應用程序中獲取這些HTTP請求的結果的人,我有點困惑」。

那麼,鑑於上下文,(pipe)(pass)有什麼不同呢?

(具體後端應用程序,我用是Magento的,一個基於PHP的電子商務應用程序的工作,如果該事項(mod_php,FastCGI的等)

+0

客戶端,大概是客戶的瀏覽器。後端將是Apache服務器。 – beeplogic

+3

我的理解是,管道讀取數據並直接寫入數據,並通過讀取數據,查看數據並將其寫回客戶端。後來添加Varnish頭文件等,前者加/減任何東西。所以PIPE就好像光油不存在一樣。 –

+0

或換句話說:我認爲我的目標是與薛定諤貓比較。管只是給你的盒子。通票首先在箱子裏看起來。 –

回答

7

我不以任何方式清漆專家,但這個根據我的經驗和我的管理解與通

隨着通清漆作爲一個普通HTTP代理;它讀取請求,並將其推到後端(阿帕奇/ Nginx的)

,另一方面nd,將清漆變爲TCP代理,在Magento的情況下,當後端將文件作爲CSV,pdf或可下載文件返回時,這變得非常方便。例如:

if (req.url ~ ".*/orderprint/.*") 
{ 
     set req.http.connection = "close"; 
     return(pipe); 
} 

如果沒有,我們將不斷地看到超時服務的文件或客戶試圖下載他們下載的產品時。

+1

這就是我的記憶:精神上我使用Unix來記住哪些是做什麼的。 Pipe類似於Unix |它不斷將傳入的數據傳送給瀏覽器。 另一方面,通過將Backend服務器傳遞給瀏覽器之前收集整個響應。 – Talesh

+0

我將添加此文檔閱讀與解釋多一點。傳遞不會將任何內容輸入緩存也很重要。 https://www.varnish-cache.org/docs/4.0/users-guide/vcl-built-in-subs.html?highlight=pipe –

3

艾倫基本上概括起來相當不錯,更詳細一點,我們可以看看到清漆,並比較兩通()和管道():

PIPE:

https://github.com/varnish/Varnish-Cache/blob/master/bin/varnishd/cache/cache_req_fsm.c#L552

在cnt_pipe(...)清漆處理返回(管道);命令。 bo = VBO_GetBusyObj(wrk, req);從當前req請求對象生成新的bo(後端請求對象)。

http_PrintfHeader(bo->bereq, "X-Varnish: %u", VXID(req->vsl->wid)); 
http_SetHeader(bo->bereq, "Connection: close"); 
VCL_pipe_method(req->vcl, wrk, req, bo, NULL); 

在這一點上光油設置在後端請求X-VarnishConnection: close頭,並調用VCL_pipe_method(這是從VCL文件中提取),所以,如果你願意,你可以事後處理後端的請求。不需要在你的VCL中明確地設置Connection: close

經過一些檢查清漆調用VDI_Http1Pipe(req, bo)(在if語句中)。 VDI_Http1Pipe調用http1pipe,它調用V1F_SendReq發送請求並處理所有的HTTP內容。 V1P_Process將數據發送回實際的客戶端(通常是訪問該頁面的瀏覽器)。

返回cnt_pipe函數返回return (REQ_FSM_DONE);,所以內部狀態機完成並且請求處理完成。

總結:除了明確關閉連接並在後端請求上設置X-Varnish標頭外,Varnish不會做任何其他事情。

PASS:

https://github.com/varnish/Varnish-Cache/blob/master/bin/varnishd/cache/cache_req_fsm.c#L518

現在讓我們來看看爲cnt_pass,這是從VCL處理return (pass);功能: 而不是直接調用VDI_Http1Pipe方法光油調用VBF_Fetch,它使用Pool_Task排隊任務(任務是獲取後端響應並將其交付給客戶端)。

完成該任務後cnt_pipe清理內存並返回return (REQ_FSM_DONE);以確保沒有其他工作要做,包括在您的VCL文件中調用deliver等等。

結論:

pipe實際上並不充當TCP-管作爲艾倫說,但非常相似。調用pipe基本上告訴Varnish發送請求,交付結果,然後停止關心任何事情(包括日誌記錄等)。基本上是某種「即忘即忘」。

pass也發出了請求,並將結果返回給客戶端,但將確保日誌寫入和光油能夠處理它自己的東西,也是你的VCL的deliver函數被調用,這不是發生在你使用pipe

2

我的理解是,(管道)讀取數據並直接寫入數據,然後(通過)讀取數據,查看數據並將其寫回客戶端。後者添加了Varnish頭文件等,前者添加/減去任何東西。所以一個(管道)就好像光油不存在一樣。

或換句話說:我想我是瞄準薛定諤貓比較。 (管道)只是給你的盒子。 (通行證)首先在框中查找。

(管道)也意味着任何被添加到請求直到調用(管道)的請求,比如在beresp中被拋棄。

有人可能會爭辯說,你會希望(管道)儘可能早的表現,但我懷疑你會找到任何指標來真正支持這個論點。

1

pipe通常需要websocket連接,其中請求不應該被修改或緩衝。

注意:pipe將愉快地通過同一連接傳輸後續(保活)請求。這意味着Varnish不會添加任何X-Forwarded-For標頭,您將失去客戶端的IP。

相關問題