← 返回部落格

Cloudflare Workers IP 地理位置:快取與冷啟動

Cloudflare Workers IP 地理位置:快取與冷啟動

Cloudflare Workers IP 地理位置,指的是在 Worker 內讀取訪客的位置資料,來源可以是內建的 request.cf 物件,或是從邊緣節點呼叫外部的 IP 情資 API。這兩種做法回答的是不同的問題,在據以建構之前,值得先了解各自的快取與冷啟動行為。

Workers 免費提供什麼

每個抵達 Worker 的請求都帶有由 Cloudflare 填入的 request.cf 物件。其中包含訪客的國家、城市、地區、座標、時區、ASN 與 AS 組織,以及標明處理該請求的資料中心的 colo 欄位。CF-IPCountry 標頭同樣帶有國家代碼。由於這些資料在你的程式碼執行之前就已附加,所以不會產生額外的子請求(subrequest),也不會增加延遲。

限制在於範圍。request.cf 描述的是目前請求的連線用戶端,僅此而已。它無法告訴你出現在日誌行、表單欄位、webhook 酬載或 X-Forwarded-For 鏈中的 IP 位址,也不帶有 VPN、Tor 或濫用旗標等信譽訊號。一旦你需要擴充任意位址的資料,就必須呼叫 API,而快取的決策也就從這裡開始。

在邊緣快取擴充資料

從 Worker 發出的 IP 查詢是一個子請求,因此每一次未快取的查詢都會在請求路徑上增加一次網路往返。Cloudflare 提供幾個快取結果的位置:Cache API(每個資料中心各自獨立,不會全球複寫)、KV(全球皆可讀取但為最終一致性,寫入需要時間傳播),以及需要單一協調副本時使用的 Durable Objects。它們都不是即插即用的全球快取,所以請依你能容忍的程度來挑選:對於讀取頻繁的查詢,Cache API 最簡單也最快,而 KV 則適合你希望在每個地點都能看到的值。

更有用的設計決策是每個欄位各自的存活時間(TTL),因為 IP 情資資料的老化速度並不一致。國家與 ASN 的配置變動緩慢,因為位址區塊是以月或年為單位重新配發,所以數小時的 TTL 是合理的。信譽旗標則不同。ipto 的 VPN、Tor 與濫用情資來源每 6 小時更新,其 IP 與 ASN 資料集每天更新,因此將 is_tor 這類旗標快取超過數小時,意味著你提供的答案會比來源本身還舊。實用的切分方式是:網路事實(asn、asn_org、國家、城市)快取約一天,而旗標(is_vpn、is_tor、is_abuser、is_datacenter)則不超過情資來源的更新間隔。

  • 以正規化後的 IP 作為快取鍵(對 IPv6 而言,如果你的使用情境是以網路而非主機為單位,可考慮以 /64 作為鍵)。
  • 也要快取負面結果,這樣重複查詢未列入的位址時,就不會每次都打到 API。
  • 切勿不小心將 bogon 結果以公開鍵快取:像 10.0.0.1 這樣的私有位址可以在本機回答,無須任何 API 呼叫。

Workers 上的冷啟動

Workers 執行在 V8 isolate 而非容器中,因此冷啟動通常只需數毫秒,而不是容器型函式所熟悉的數百毫秒。你的程式碼仍要為自己的初始化付出代價:龐大的套件、對大型查找表進行繁重的模組層級解析,或頂層 await,都會在全新 isolate 收到第一個請求時發生。解法很平常:保持套件小巧,避免在啟動時建立大型的記憶體內結構,並且偏好單一的小型 API 呼叫,而不是把整個地理位置資料庫塞進 Worker 裡。

人們在傳統無伺服器環境中使用的暖機 ping,在這裡大多是白費力氣。Isolate 依 Cloudflare 的排程建立與回收,一次 ping 只會到達單一地點,而冷啟動的成本小到讓快取查詢結果遠比讓 isolate 保持存活更重要。在最佳化任何事情之前,請先用 Workers 分析以及你自己圍繞子請求的計時進行量測。

與 ipto 結合運用

合理的模式是:以 request.cf 取得關於連線用戶端的即時、免費資訊,只在需要更多資料時才呼叫擴充 API。ipto 的 API 文件展示了 IP 查詢的回應,其中回傳國家、城市、ASN、org、currency_code,以及旗標 is_vpn、is_tor、is_abuser、is_datacenter 與 bogon/bogon_type。它免費且無須註冊,每天有 1,000 次免費請求,足以在不經過金鑰管理步驟的情況下為 Worker 製作原型。

當查詢告訴你該位址屬於某個主機代管網路時,你可以接著使用 ASN 查詢,查看是誰在營運它,以及它宣告了哪些範圍。對於被標記的流量,VPN、Tor 與代理檢查器會顯示 is_vpn 與 is_tor 背後的證據,而 IP 濫用檢查器則顯示經過佐證的分數。請記住,城市層級的位置是對網路註冊或路由所在地的估計,而不是某個人所在的位置,這項限制在為何城市準確度有限中有說明。

邊緣讓查詢變快,但並不會讓底層資料更精確。請將 request.cf 與任何 API 結果視為同一類證據,依其變動速度分別快取,並讓來源的新鮮度,而不是邊緣的速度,決定你的 TTL。

直接的答案

request.cf 是 Cloudflare 附加在 Worker 中每個請求上的物件。其中包含用戶端的國家、城市、地區、座標、時區、ASN 與 AS 組織,以及處理該請求的 colo。
不能。request.cf 物件只描述目前請求所連線的用戶端。若要擴充日誌或酬載中任意 IP 位址的資料,請從 Worker 呼叫 IP 情資 API 並快取結果。
國家與 ASN 等變動緩慢的網路事實可快取約一天,而 VPN、Tor 與濫用等信譽旗標的快取時間不應超過來源情資的更新間隔。ipto 的威脅情資來源每 6 小時更新,IP 與 ASN 資料集每天更新。
← 返回部落格