Squid 代理服務器的 refresh_pattern 指令控制無明確過期頭(Expires/Cache-Control)的對象在緩存中的存活策略。本文系統拆解參數含義、LM-factor 算法、常用選項,並給出生產環境常見靜態資源配置模板。
refresh_pattern [-i] regex min percent max [options]
| 參數 | 含義 | 單位/範圍 |
|---|---|---|
-i | 正則不區分大小寫 | — |
regex | 匹配 URL 的正則表達式 | POSIX Extended Regex |
min | 最小存活時間(強制新鮮) | 分鐘,0=無最小限制 |
percent | LM-factor 百分比閾值 | 0~100,見下文算法 |
max | 最大存活時間(強制過期) | 分鐘 |
options | 修飾符(override-expire 等) | 見下表 |
對象進入緩存後,Squid 追蹤兩個年齡:
Date 頭時間 - Last-Modified 時間。代表源站對象「已存在多久」。LM-factor = Response Age / Resource Age(無 Last-Modified 則視為 0)。
判斷邏輯:
min → 新鮮(直接命中)。max → 過期(必須驗證/重取)。percent/100 → 新鮮;percent/100 → 過期。| 選項 | 作用 | 適用場景 |
|---|---|---|
override-expire | 忽略源站 Expires,優先檢查 min | 源站 Expires 過短/不可信,強制最小緩存 |
override-lastmod | 忽略 Last-Modified,優先檢查 min | 源站 Last-Modified 不準,強制最小緩存 |
reload-into-ims | 客戶端 Cache-Control: no-cache → 轉發為 If-Modified-Since | 帶寬受限環境,避免強制刷新穿透源站 |
ignore-reload | 忽略請求中的 no-cache/Pragma: no-cache | 極少變動資源(圖片、視頻、字體),永久緩存直到 purge |
# === 核心原則:靜態資源長緩存,動態內容短緩存/不緩存 ===
# 1. 文本類靜態資源:HTML/XML/CSS/JS —— 1 天 min,90% LM,90 天 max,允許 reload-into-ims
refresh_pattern -i \.html?$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.xml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.css$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.json$ 1440 50% 129600 reload-into-ims # API 響應較動態,percent 降低
# 2. 圖片/媒體:極少變動,ignore-reload 防止強制刷新浪費帶寬
refresh_pattern -i \.(jpe?g|png|gif|webp|avif|ico|svg)$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.(mp4|webm|ogg|mp3|wav|flac)$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.(woff2?|ttf|eot|otf)$ 1440 90% 129600 ignore-reload
# 3. 字體/文檔/壓縮包
refresh_pattern -i \.(pdf|docx?|xlsx?|pptx?|zip|tar|gz|rar|7z)$ 1440 50% 129600 reload-into-ims
# 4. 動態腳本/API:不緩存或極短緩存
refresh_pattern -i \.(php|jsp|asp|aspx|do|action)$ 0 0% 0
refresh_pattern -i /api/ 0 0% 0
# 5. 預設兜底:10 分鐘 min,20% LM,1 天 max
refresh_pattern . 10 20% 1440
# 1. 查看對象緩存狀態
squidclient -h proxy -p 3128 mgr:info | grep -A5 'HTTP/1.1 200'
# 2. 模擬請求觀察 X-Cache
curl -I -x proxy:3128 https://example.com/style.css
# 觀察:X-Cache: HIT/MISS, Age, Cache-Control
# 3. 強制刷新測試 reload-into-ims
curl -I -H 'Cache-Control: no-cache' -x proxy:3128 https://example.com/style.css
# 應見 If-Modified-Since 轉發至源站
# 4. 查看具體對象元數據
squidclient -h proxy -p 3128 mgr:store | grep style.css
percent 設 100% 等同於「永不過期(直到 max)」,設 0% 等同於「min 後立即過期」。max 不宜過大(> 1 年),導致磁盤佔用失控、清理困難。Cache-Control/ETag,Squid 會優先遵守顯式頭,refresh_pattern 僅作兜底。ssl_bump 解密),上述規則僅對 HTTP 或已解密流量生效。