2014-06-11 39 views
1

讓我用一個例子解釋:什麼時候應該在vcl_recv和vcl_fetch下添加相同的策略?

文件: /etc/varnish/default.vcl

# [...] 

sub vcl_recv { 

    # [...] 

    if (req.request != "GET" && req.request != "HEAD") { 
     return (pass); 
    } 

    if (req.http.Authorization || req.http.Authenticate) { 
     return (pass); 
    } 

    if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)") { 
     return (pass); 
    } 

    # [...] 

    return (lookup); 
} 

sub vcl_fetch { 

    # [...] 

    if (req.request != "GET" && req.request != "HEAD") { 
     return (hit_for_pass); 
    } 

    if (req.http.Authorization || req.http.Authenticate) { 
     return (hit_for_pass); 
    } 

    if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)") { 
     return (hit_for_pass); 
    } 

    # [...] 

    return (deliver); 
} 

正如你所看到的,因爲這不應該被緩存的內容,我有同樣的政策分別爲vcl_recvvcl_fetch,但分別爲return (pass);return (hit_for_pass);

在某些情況下,應該完成這項工作(when it is useful),以及其他絕對不必要的情況。他們是什麼? (如Cookies?如果是這樣,怎麼辦?)

回答

1

我真的不明白爲什麼應該有任何情況下,這是有用的。當VCL不知道所產生的響應不能被緩存時,你可以創建命中傳遞對象。如果VCL可以認爲我們不應該緩存響應,那麼應該「通過」並完成它,避免整個創建過程。

所以,建議很簡單。你可以在recv中使用pass,但是如果你不知道對象的cacheability,你應該回頭讓varnish創建hit-for-pass對象,從而避免序列化事務。

相關問題