觀點 · 資訊分享

Cloudflare 快取換上 Pingora 新引擎:背景更新舊內容,但有 3 項行為會變

Cloudflare 宣布快取改跑在以 Rust 打造的 Pingora 新代理上,官方說延遲更低、快取未命中更少,也新增非同步 stale-while-revalidate。同時有 3 項行為變動,用 CDN 的網站建議先檢查。

發布
2026-05-05
篇幅
約 3 分鐘 · 1,447 字
結構
8 節 + 3 題常見問題
標籤
#Cloudflare#Pingora#CDN#快取#Rust
Cloudflare 快取換上 Pingora 新引擎:背景更新舊內容,但有 3 項行為會變

一句話看懂:Cloudflare 把快取換成以 Pingora 打造的新代理,官方說延遲更低、更記憶體安全,還多了背景更新舊內容的功能,但有 3 項行為會跟以前不一樣。

Cloudflare 快取換新引擎資訊圖卡:快取改跑在 Pingora 上,延遲更低,但有 3 項行為變動

先用白話講:CDN 快取在做什麼?

想像你開了一間便當店,每次有人點餐都要回總店拿,很慢。於是在各地設「分店冰箱」,常被點的便當先放著,客人來就直接拿,這就是 CDN 的快取。

這次 Cloudflare 做的,是把所有分店冰箱背後的「出餐系統」整套換掉。

發生什麼事

Cloudflare 在 5 月 4 日的更新紀錄中說,快取現在跑在一個用 Pingora 打造的新代理上。Pingora 是用 Rust 寫的框架,官方說它已經在處理 Cloudflare 網路上相當大一部分的流量。

官方列出的好處:

  • 延遲更低:改善連線重複利用,每個請求的額外負擔變少
  • 快取未命中更少:快取保留得更好,源站被打的次數變少
  • 更符合 RFC:快取行為更貼近 HTTP 快取標準
  • 也比較「記憶體安全」,並為之後的新功能打好底子

兩個新功能

  1. 非同步 stale-while-revalidate:內容過期後,每個請求都會立刻拿到舊內容,更新在背景進行。以前過期後的第一個請求,會卡著等源站回應。
  2. 未命中的回應預設不緩衝:不走快取的回應直接串流給使用者,官方說這能縮短第一個位元組的等待時間。

3 項行為變動

這是最容易被忽略、但可能影響網站的部分:

項目 新行為
Vary: * 整個回應改為不快取(官方引用 RFC 9110 的規定)
Set-Cookie 未命中與過期時也會移除,不只是命中時
小數 TTL 像 max-age=1.5 會無條件捨去成整數,不再被當成無效

給開發者的技術細節

  • 如果你的程式在回應裡帶 Vary: *,過去可能被存進快取,現在會直接繞過快取,源站流量可能增加
  • 如果你的流程依賴「第一次未命中時,使用者能拿到 Set-Cookie」,行為會改變,需要重新測試登入或追蹤用的 Cookie
  • 小數 TTL 現在會被接受並捨去,例如 max-age=1.5 等於 1 秒,這是依官方描述的自行解讀
  • 官方說更深入的技術介紹「很快」會放在 Cloudflare 部落格,目前公告沒有給出效能的具體數字

我的看法

對小團隊與接案者來說,這類「平台底層換引擎」的消息最麻煩,因為你什麼都沒改,行為卻可能不同。好處是官方這次把三項行為變動寫得很清楚,照著檢查就好。

我會建議用 Cloudflare 當 CDN 的網站,花十分鐘做兩件事:搜一下自己的回應有沒有 Vary: *,再確認會員或購物車相關的 Cookie 在快取路徑上有沒有被影響。沒問題就當作白賺一次升級;官方也還沒公布具體的效能數字,不用期待立刻看到大幅變化。

名詞小辭典

  • CDN:內容傳遞網路,把網站內容複製到全球各地,讓使用者從最近的地方拿資料。
  • Pingora:Cloudflare 用 Rust 寫的網路代理框架,專門處理大量流量。
  • stale-while-revalidate:先給使用者過期的舊內容,同時在背景更新,讓人不用等。
  • TTL:存活時間,快取內容可以被當成新鮮資料的秒數。

資料來源

常見問題

Pingora 是什麼?
Pingora 是 Cloudflare 用 Rust 寫的網路代理框架,官方說它已經處理了 Cloudflare 網路上相當大一部分的流量。這次是把快取也搬到以它打造的新代理上。
stale-while-revalidate 是什麼意思?
意思是快取內容過期後,先把舊內容回給使用者,同時在背景向源站要新內容。官方說新版是每個請求都會立刻拿到舊內容,不會再讓過期後的第一個請求卡在源站。
我的網站需要改設定嗎?
官方沒有要求一定要改,但列出了三項行為變動。如果你的回應有帶 Vary: *、在未命中時依賴 Set-Cookie,或把 max-age 寫成小數,建議檢查一下。
LINE