22 冷鏈週轉:HTTP的緩存代理

緩存代理服務

image

在 HTTP 的緩存體系中,緩存代理的身份十分特殊,它“既是客戶端,又是服務器”,同時也“既不是客戶端,又不是服務器”。

說它“即是客戶端又是服務器”,是因爲它面向源服務器時是客戶端,在面向客戶端時又是服務器,所以它即可以用客戶端的緩存控制策略也可以用服務器端的緩存控制策略,也就是說它可以同時使用第 20 講的各種“Cache-Control”屬性。

但緩存代理也“即不是客戶端又不是服務器”,因爲它只是一個數據的“中轉站”,並不是真正的數據消費者和生產者,所以還需要有一些新的“Cache-Control”屬性來對它做特別的約束。

源服務器的緩存控制

首先,我們要區分客戶端上的緩存和代理上的緩存,可以使用兩個新屬性“private”和“public”。

“private”表示緩存只能在客戶端保存,是用戶“私有”的,不能放在代理上與別人共享。而“public”的意思就是緩存完全開放,誰都可以存,誰都可以用。

其次,緩存失效後的重新驗證也要區分開(即使用條件請求“Last-modified”和“ETag”),“must-revalidate”是隻要過期就必須回源服務器驗證,而新的“proxy-revalidate”只要求代理的緩存過期後必須驗證,客戶端不必回源,只驗證到代理這個環節就行了。

再次,緩存的生存時間可以使用新的“s-maxage”(s 是 share 的意思,注意 maxage中間沒有“-”),只限定在代理上能夠存多久,而客戶端仍然使用“max_age”。

還有一個代理專用的屬性“no-transform”。代理有時候會對緩存下來的數據做一些優化,比如把圖片生成 png、webp 等幾種格式,方便今後的請求處理,而“no-transform”就會禁止這樣做,不許“偷偷摸摸搞小動作”。

語境參考前幾章作者說的“生鮮速遞 + 便利店”,也可以自己理解,顧客 - 瀏覽器,便利店 - 代理,超市 - 源服務器

# 這就是說水果不能放進冷櫃,必須直接給顧客,保鮮期 5 天,過期了還得去超市重新進貨。
private, max-age=5
# 這個的意思就是可以在冰櫃裏存 10 天,但顧客那裏只能存 5 天,過期了可以來便利店取,只要在 10 天之內就不必再找超市。
public, max-age=5, s-maxage=10
# 因爲緩存默認是public 的,那麼它在便利店和顧客的冰箱裏就都可以存 30 天,過期後便利店必須去超市進新貨,而且不能擅自把“大排”改成“小排”。
max-age=30, proxy-revalidate, no-transform

客戶端的緩存控制

max-age、no_store、no_cache 這三個屬性在第 20 講已經介紹過了,它們也是同樣作用於代理和源服務器。

關於緩存的生存時間,多了兩個新屬性“max-stale”和“min-fresh”。

“max-stale”的意思是如果代理上的緩存過期了也可以接受,但不能過期太多,超過 x 秒也會不要。“min-fresh”的意思是緩存必須有效,而且必須在 x 秒後依然有效。

比如,草莓上貼着標籤“max-age=5”,現在已經在冰櫃裏存了 7 天。如果有請求“max-stale=2”,意思是過期兩天也能接受,所以剛好能賣出去。

但要是“min-fresh=1”,這是絕對不允許過期的,就不會買走。這時如果有另外一個菠蘿是“max-age=10”,那麼“7+1<10”,在一天之後還是新鮮的,所以就能賣出去。

有的時候客戶端還會發出一個特別的“only-if-cached”屬性,表示只接受代理緩存的數據,不接受源服務器的響應。如果代理上沒有緩存或者緩存過期,就應該給客戶端返回一個504(Gateway Timeout)。

其他問題

第一個是“Vary”字段,在第 15 講曾經說過,它是內容協商的結果,相當於報文的一個版本標記。

同一個請求,經過內容協商後可能會有不同的字符集、編碼、瀏覽器等版本。比如,“Vary: Accept-Encoding”“Vary: User-Agent”,緩存代理必須要存儲這些不同的版本。

當再收到相同的請求時,代理就讀取緩存裏的“Vary”,對比請求頭裏相應的“ Accept-Encoding”“User-Agent”等字段,如果和上一個請求的完全匹配,比如都是“gzip”“Chrome”,就表示版本一致,可以返回緩存的數據。

另一個問題是“Purge”,也就是“緩存清理”,它對於代理也是非常重要的功能

  • 過期的數據應該及時淘汰,避免佔用空間;
  • 源站的資源有更新,需要刪除舊版本,主動換成最新版(即刷新);
  • 有時候會緩存了一些本不該存儲的信息,例如網絡謠言或者危險鏈接,必須儘快把它們刪除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章