Varnish
Varnish - 如何在響應標頭中設置 TTL?
我以前沒有在 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 的客戶端,你有像
req
和resp
訪問請求和響應資訊的對象。當您必須訪問後端時,該req
對象將用於建構bereq
對象並將響應儲存在對beresp
像中。正如您注意到的那樣,
beresp
上下文在 中不可用vcl_deliver
,因為傳遞階段發生在客戶端。這就是為什麼最好將
X-TTL
標頭設置在後端。這是執行此操作的 VCL 程式碼:
sub vcl_backend_response { set beresp.http.X-TTL = "TTL (" + beresp.ttl +")"; }