Varnish

Varnish - 如何在響應標頭中設置 TTL?

  • March 19, 2021

我以前沒有在 Varnish 上嘗試過這個。而且我必須承認,我上一次使用 Varnish 的經歷要追溯到很久以前 - 版本 2.1.5 天!

我已將 varnish 6.x 設置為簡單/基本的靜態 http-cache。我已經從這個清漆中實現了我希望的大部分內容,然後我想到了將 cache-ttl 資訊顯示為響應標頭。在這裡,我遇到了障礙。我肯定做錯了。可能 vcl_delivery 可能不會得到 beresp.ttl。我不確定。這是我添加到 vcl_deliver

set resp.http.X-TTL = "TTL (" + beresp.ttl +")";

我得到編譯錯誤:

Mar 19 07:05:41  varnishd[55516]: Message from VCC-compiler:
Mar 19 07:05:41  varnishd[55516]: ('/etc/varnish/default.vcl' Line 97 Pos 40) -- (Pos 49)
Mar 19 07:05:41  varnishd[55516]:     set resp.http.X-TTL = "TTL (" + beresp.ttl +")";
Mar 19 07:05:41  varnishd[55516]: ---------------------------------------##########------
Mar 19 07:05:41  varnishd[55516]: Not available in method 'vcl_deliver'.

我嘗試將 beresp.ttl 分配為 vcl_backend_response 中的標頭變數:

set beresp.http.x-ttl = beresp.ttl

那也沒有用。

讓我想知道,這是否可能?如果是這樣,如何實現?

從 Varnish 4 開始,後端和客戶端邏輯被分割成不同的執行緒。這種分裂也反映在 VCL 中。

在 Varnish 的客戶端,你有像reqresp訪問請求和響應資訊的對象。當您必須訪問後端時,該req對象將用於建構bereq對象並將響應儲存在對beresp像中。

正如您注意到的那樣,beresp上下文在 中不可用vcl_deliver,因為傳遞階段發生在客戶端。

這就是為什麼最好將X-TTL標頭設置在後端。

這是執行此操作的 VCL 程式碼:

sub vcl_backend_response {
   set beresp.http.X-TTL = "TTL (" + beresp.ttl +")";
}

引用自:https://serverfault.com/questions/1057573