簡體   English   中英

基於標題的清漆緩存

[英]Varnish cache based on header

目前我在運行大約30-40個不同網站的服務器上運行Varnish。 所有這些網站都使用相同的庫來處理請求(每個網站都有自己的域)。 但是,其中一些網站非常簡單,可以完全緩存。 我想要做的是在項目/網站(特定標題)中啟用一個標志,告訴varnish在交付后緩存請求。 這樣的構造是否可行,因為我不想為每個可以完全緩存的項目編輯VCL,並向vcl_fetch添加一個條目,如:

if (req.http.host ~ "<website>")
{
    unset req.http.cookie;
    return (lookup)
}

有沒有正確的方法來做到這一點? 我確實看過Varnish流程圖,但無法找到一個好的解決方案。

提前致謝!

我希望這可以幫到你。 在下面的示例中,自定義標頭用作條件。

sub vcl_fetch {
    if (req.http.Custom-Header == "www.site.com" {
       set beresp.ttl = [...]
       [...]
     }
     elsif (req.http.Custom-Header == "www.site2.com" {
       set beresp.ttl = [...] 
      }
      else {
      [...]
      }
      return(deliver);
}

好吧,我剛開始使用Varnish並喜歡這個主意。 因為我有麻煩,我只想緩存幾個域,並且不想一直更改vcl。

我研究設置一個“特殊”標題然后讓清漆做魔術。

但后來我查看了文檔,還有更簡單的方法。

header('Cache-Control: public, max-age=10');

這種方式清漆將內容緩存10秒。 因此,如果您想永久緩存它,那么您可以使用一個非常高的整數。

// Caches the content for a year, if my calculations are right :P
header('Cache-Control: public, max-age=' . (60 * 60 * 24 * 365));

Varnish將尊重響應頭中后端表示的TTL。 如果要緩存站點X,請使用mod_expires(或類似)並從后端正確設置TTL。 如果您希望不緩存站點Y,請設置Cache-Control: s-maxage=0 ,Varnish不會緩存它。

如果您必須有一個特定的響應頭,這里有一些示例VCL:

  sub vcl_fetch {
       if (beresp.http.x-do-not-cache) {
           set beresp.ttl = 0s;
       }
  }

請注意,我在這里沒有做return()。 通過設置TTL並降至默認VCL Varnish將自行處理。

默認情況下,Varnish在不更改任何VCL的情況下讀取后端返回的HTTP 1.1標准緩存標頭(Cache-Control,Expires等),並根據這些標頭緩存對象。 所以只要你return (lookup); 在vcl_recv中,Varnish已經配置為執行您想要的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM