簡體   English   中英

Varnish不會在沒有過期標頭的情況下進行緩存

[英]Varnish doesn't cache without expire header

在我的服務器上,我的Varnish(緩存)在端口80上運行,而Apache在8080上運行。
當我設置如下標題時,Varnish緩存非常好:

    $this->getResponse()->setHeader('Expires', '', true);
    $this->getResponse()->setHeader('Cache-Control', 'public', true);
    $this->getResponse()->setHeader('Cache-Control', 'max-age=2592000');
    $this->getResponse()->setHeader('Pragma', '', true);

但這意味着人們可以緩存我的網站,而永遠不會檢索可用的新版本。
當我刪除標題時,人們會在每次重新加載頁面時檢索一個新版本(因此Varnish從不緩存)。

我不知道這里出了什么問題。
我的理想情況是,人們不要在客戶端緩存html,而是將其留給Varnish。

我的理想情況是,人們不要在客戶端緩存html,而是將其留給Varnish。

您想要的是清漆以緩存資源並將其提供給客戶端,並且僅在發生更改時才生成新版本。 最簡單的方法是使清漆高速緩存很長時間,並在此更改后使清漆中的條目無效(使用PURGE命令)。

默認情況下,清漆將其緩存規則基於后端提供的標頭。 因此,如果您的php代碼生成了您描述的標頭,則默認的清漆vcl將相應地調整其緩存策略。 但是,它只能以通用,安全的方式執行此操作(例如,如果您使用cookie,它將永遠不會緩存)。 您知道后端的工作方式,並且不應該通過從后端發送不同的標頭來更改varnish的緩存行為,而應編寫一個varnish .vcl文件。 即使缺少Max-Age標頭的Cache-Control,也應告訴varnish長時間緩存資源(在.vcl文件中設置TimeToLive ttl)。 然后,Varnish將繼續處理生成的條目,直到ttl通過或您清除了該條目。

如果您能做到這一點,那么還有一個更高級的選項:在客戶端上緩存資源,但是讓客戶端在每次使用它時對其進行“重新驗證”。 瀏覽器使用HTTP GET加上If-Modified-Since標頭(您的響應應包括Date標頭來引起他的行為)或If-Match標頭(您的響應應包括ETAG標頭來引起他的行為)來執行此操作。 這樣可以節省帶寬,因為清漆可以使用304 NOT-MODIFIED響應進行響應,而無需再次發送整個資源。

最簡單的方法是將最大壽命降低到更合理的水平。 目前,您將其設置為30天。 嘗試將其設置為15分鍾:

$this->getResponse()->setHeader('Cache-Control', 'max-age=900');

Web緩存是一個有點復雜的主題,一些截然不同的客戶端解釋加劇了這一點。 但是總的來說,這將減輕Web服務器的負載,同時確保在合理的時間范圍內可以使用新內容。

將客戶端緩存的標准HTTP標頭設置為所需的內容。 設置僅Varnish會看到的自定義標頭,例如X-Varnish-TTL然后在您的VCL中,將以下代碼合並到vcl_fetch子目錄中:

if (beresp.http.X-Varnish-TTL) {
    C{
        char *ttl;
        /* first char in third param is length of header plus colon in octal */
        ttl = VRT_GetHdr(sp, HDR_BERESP, "\016X-Varnish-TTL:");
        VRT_l_beresp_ttl(sp, atoi(ttl));
    }C
    unset beresp.http.X-Varnish-TTL;  // Remove so client never sees this
}

暫無
暫無

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

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