HTTP/1.1 200 OK
X-Cache: HIT from proxy-01
X-Cache-Lookup: HIT from proxy-01:3128
Via: 1.1 proxy-01 (squid/4.15)
Age: 120
乍看之下重複,實則語義截然不同。搞清兩者差異,是排查緩存命中率異常、驗證緩存層級架構的關鍵。
| 標頭 | 含義 | 來源 | 典型值 |
|---|---|---|---|
| X-Cache | 本節點的最終緩存結果:請求是否由此 Squid 實例直接命中緩存並服務 | 回應生成時刻,由 HttpReply::putCacheHeaders() 寫入 | HIT from MISS from |
| X-Cache-Lookup | 緩存查詢階段的結果:在查詢緩存索引(內存/磁碟/對等節點 ICP/HTCP)時是否找到對象 | 查詢階段結束時,由 HttpStateData::cacheLookupHit() 記錄 | HIT from MISS from |
| 場景 | X-Cache | X-Cache-Lookup | 業務含義 | 常見原因 |
|---|---|---|---|---|
| 完美命中 | HIT | HIT | 查詢找到,直接服務,零上游請求 | 熱門靜態資源、緩存未過期、無 Vary/Range 複雜度 |
| 查詢命中但最終 MISS | MISS | HIT | 索引中有對象,但不可服務,需回源驗證/重取 | 見下文詳細分析 |
| 查詢未命中 | MISS | MISS | 索引無對象,必須回源獲取 | 冷數據、首次訪問、緩存剛被淘汰 |
| 查詢命中但標頭異常 | HIT | MISS | 極罕見,邏輯錯誤或標頭改寫導致 | 邊緣層 Nginx 修改標頭、Squid 版本 Bug |
對象在緩存中,但 Expires/max-age 已過期。Squid 按 refresh_pattern 規則發起 條件請求(If-Modified-Since/If-None-Match)回源驗證:
304 Not Modified → 對象有效 → Squid 服務緩存內容 → X-Cache=MISS(因發起上游請求),X-Cache-Lookup=HIT(索引命中)。200 OK 新內容 → 替換緩存 → 服務新內容 → 同樣標頭組合。用戶按 Ctrl+F5 或瀏覽器發送 Cache-Control: no-cache/Pragma: no-cache。若 Squid 配置 refresh_pattern ... reload-into-ims:
客戶端請求 Range: bytes=0-1023,緩存中有完整對象但無該範圍的獨立緩存條目。Squid 判定查詢命中(找到完整對象),但需回源獲取完整內容以滿足範圍請求(或切片服務),導致 MISS / HIT。
# 原配置:過期時間極短,頻繁驗證
refresh_pattern example.com 10 0% 60 reload-into-ims
# 結果:高頻出現 MISS/HIT
# 調整:忽略客戶端 no-cache,延長過期時間
refresh_pattern example.com 1440 0% 2880 ignore-reload
# 結果:絕大多數變為 HIT/HIT
# 進階:區分靜態/動態
refresh_pattern -i \.(jpg|png|css|js)$ 10080 90% 43200 override-expire ignore-no-cache ignore-private
refresh_pattern . 0 20% 4320
Client → Edge Squid (Port 80) → Core Squid (Port 3128) → Origin
# Edge 回應標頭
X-Cache: HIT from edge-01
X-Cache-Lookup: HIT from edge-01:80
Via: 1.1 edge-01, 1.1 core-01
# Core 回應標頭(Edge 作為 Client 看到的)
X-Cache: HIT from core-01
X-Cache-Lookup: HIT from core-01:3128
關鍵點:每級代理獨立生成自己的 X-Cache/Lookup,Via 標頭記錄完整代理鏈。分析時需按層級拆解,而非混淆比較。
Cache-Control: max-age=..., public?無頭則 Squid 不緩存(除非 refresh_pattern 強制)。ignore-reload、ignore-no-cache、override-expire 是否按業務意圖配置?Age 非零證明經過代理緩存;遞增證明命中緩存服務。tcpdump -i any -s0 -w squid.pcap port 3128,Wireshark 過濾 http.response.header contains "X-Cache" 精準定位。X-Cache =「這個請求最終有沒有走緩存服務?」
X-Cache-Lookup =「緩存索引查詢階段有沒有找到對象?」
MISS / HIT 組合不代表緩存失效,往往是「查到但需驗證」的正常行為。通過調整 refresh_pattern、優化後端緩存頭、合理設定 ignore-reload,可將誤判為 MISS 的驗證請求最小化,真實提升命中率與用戶體驗。