2012-02-08 47 views
0

我是一個絕對新手清漆&緩存在一般情況下,所以這個問題可能是一些微不足道!清漆/魷魚內容緩存與餅乾

我正在構建一個Web應用程序(在rails中),我正在尋找一些選項來緩存生產服務器上的內容。到目前爲止,我一直在研究Varnish,並且非常關心cookie的非緩存請求。我明白爲什麼這樣的行爲是有意的,但有一個用例可以真正有益於如果有某種方法通過cookie來緩存內容。

在我的特殊情況下,很多網址的數據與登錄用戶無關。例如,tripadvisor可能會將每個登錄用戶返回的酒店列表的相同數據(至少大部分數據)。所以本質上,儘管cookies會伴隨請求/響應,但大約90%的頁面對於每個用戶來說都是通用的。

在這種情況下,是否可以使用Varnish來緩存這樣的URL /頁面(可能只是公共部分)。如果是,那麼如何。

謝謝!

回答

2

如果我正確理解您的用例。即使存在cookie,您也想要緩存一部分頁面,因爲這些頁面對於所有用戶都是相同的。

要做到這一點,最好的方法是確定要緩存的頁面,比如說/foo.html和/bar.html。對於這些頁面,您可以刪除VCL中的Cookie請求標頭,以便Varnish可以緩存該頁面。

您可以使用下面的VCL代碼爲例:

sub vcl_fetch { 
    [...] 
    if(req.url ~ "/foo.html" || req.url ~ "/bar.html") { 
     unset req.http.Cookie 
    } 

    [...] 
    if (req.http.Authorization || req.http.Cookie) { 
     /* Not cacheable by default */ 
     return (pass); 
    } 
} 

如果您有更多的頁面,你可以使用正則表達式在if條件來匹配你的網頁名稱。

如果你只想一個頁面的緩存部分,那麼你可以使用ESI,因爲它是supported(的支持是有限的,但足夠)的清漆,但是這需要你來重寫你的應用程序的一部分,恕我直言,使用ESI是真的PITA從長遠來看(更難維護)。

0

默認Varnish vcl將'傳遞'請求與cookie,但使用默認的vcl只適用於測試您的Varnish服務器啓動並運行。幾乎從來沒有默認的VCL沒有經過一些修改就可以按需要工作。

您不一定需要刪除cookie。更改vcl_recv()中cookie的處理方式更容易。默認情況下,vcl_hash()不會對cookie進行散列。

另外vcl_fetch()不再存在於光油4中。