2011-05-23 85 views
3

我是Varnish的新手,我想知道Varnish是否支持使用http標頭進行緩存。 我們設計了一個Rest基礎的Web服務,我正在考慮使用Varnish來緩存結果。 有多少請求信息(apikey)是通過http頭傳遞的,我想知道在檢查傳入請求(vs查詢字符串)時我們是否可以將Varnish考慮進去。清漆和http標題

回答

10

是的,你可以。應該如何考慮這個API密鑰?如果您想爲每個用戶使用唯一的緩存條目,則只有在特定用戶多次請求相同數據時纔會使用緩存。通過設置正確的緩存控制HTTP響應頭文件(儘管數據新鮮度未被重新驗證),您可以在不使用緩存代理(如varnish)的情況下獲得很長的路徑。

這在光油中至少有兩種方法;

  1. 讓您的應用程序返回的HTTP響應頭有所不同:apikey。這指示任何HTTP級緩存(如清漆)只能重用高速緩存的結果,如果apikey請求頭是相同的。

  2. 或者,更有效地修改vcl配置中的vcl_hash函數以考慮apikey頭部。

    sub vcl_hash { set req.hash + = req.http.apikey; }

+0

爲什麼你考慮vcl_hash變化更有效率比Vary標頭?我認爲'Vary:apikey'標題選項是一個更好的選擇,因爲它可以與任何中間緩存一起工作,並且不依賴於應用邏輯隱藏的Varnish'魔術'。 – 2011-11-09 10:08:55

+3

哈希/密鑰查找是O(1),Vary頭查找是O(n),其中n是不同API密鑰的數量。如果你有許多不同的緩存條目具有相同的散列值,你必須考慮每個條目並檢查它是否與當前請求匹配。如果你有很多不同的api鍵,並且只有很少的緩存鍵/響應,這可能是低效的。檢查方法VRY_Match中bin/varnishd/cache_vary.c中的代碼。 – ivy 2011-11-09 13:18:11

+1

對於#2,你還需要在你的'vcl_recv'結尾''返回(散列);'以避免缺省的邏輯,默認情況下'通過'Authorization'或'Cookie'頭部傳遞所有請求。 – 2015-01-10 01:17:14