許多運維陷入「調參數迷思」:只調 cache_mem、maximum_object_size 等內核參數,期望榨乾效能。實則 Squid 效能上限由業務架構決定,參數調優僅能在架構允許範圍內榨取 10%~20% 提升。真正的數量級突破(100%~200%+)來自於:
無監控不優化。編譯時 --enable-snmp,部署 MRTG/Cacti/Zabbex/Prometheus+Grafana 監控核心指標:
cache_swap_low/high 水位線。Squid 預設不緩存無明確緩存頭的回應。開發人員必須在動態頁面輸出:
# PHP 範例:緩存 300 秒
$expire = 300;
header("Cache-Control: max-age=$expire, public");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expire) . " GMT");
# Java Servlet 範例
response.setHeader("Cache-Control", "max-age=300, public");
response.setDateHeader("Expires", System.currentTimeMillis() + 300_000);
關鍵點:
public 允許代理緩存;private 僅瀏覽器緩存(Squid 不緩存)。max-age 優先級高於 Expires,建議同時輸出雙重保險。Cache-Control: no-store, private)。Apache mod_expires / Nginx expires 指令按路徑/副檔名批量加頭:
# Nginx 範例
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Apache mod_expires 範例
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
優於 Squid refresh_pattern:符合 HTTP 標準、易除錯、避免前端違協配置導致的詭異問題。
登入、註冊、支付、即時 API 等不可緩存流量若混入緩存節點:
方案:api.example.com 直連上游;static.example.com 走 Squid 緩存。
下載站(GB 級安裝包)與圖片站(KB 級圖標)混跑的災難:
cache_dir,擠出熱門小文件 → 小文件 MISS 激增。方案:依文件大小分層:
| 業務類型 | 大小閾值 | Squid 叢集 | 關鍵參數差異 |
|---|---|---|---|
| 超大文件下載 | > 100MB | cluster-huge | maximum_object_size 4GB、cache_dir 大磁碟、store_avg_object_size 調大 |
| 大文件(安裝包、視頻) | 1MB ~ 100MB | cluster-large | maximum_object_size 512MB、較大 cache_mem 緩存熱門片段 |
| 小文件(圖片、JS、CSS、API JSON) | < 1MB | cluster-small | maximum_object_size 4MB、極大 cache_mem、SSD cache_dir、store_avg_object_size 32KB |
DNS 分流:dl.example.com → cluster-huge,img.example.com → cluster-small。
# 物理記憶體 64GB 機器,預留 8GB 給 OS/FS Cache
cache_mem 32 GB
maximum_object_size_in_memory 256 KB # 小文件叢集可調 512KB
memory_replacement_policy heap GDSF # 考慮對象大小與命中頻率的混合策略
a %Ss/%03>Hs %
--enable-http-violations 並載入 ngx_cache_purge 模組(或使用 Squid 3.2+ 原生 PURGE 方法),支援 curl -X PURGE https://proxy/object 精準失效。range_offset_limit -1 允許緩存大文件分片,配合 quick_abort_min/max 控制客戶端中斷後的預取行為。cache_peer ... check-interval=30 timeout=5 自動摘除故障上游。ssl-bump 解密緩存,但涉及憑證管理與合規,評估風險後謹慎啟用。wrk -t8 -c2000 -d60s --latency https://squid/ 記錄 RHR、BHR、P99 延遲、吞吐量。Squid 優化是系統工程,而非參數遊戲。正確的緩存頭 → 業務流量拆分 → 監控驅動參數調優 → 進階功能補強,四步走策略能將命中率從 50% 推至 95%+,將頻寬成本降低 80%+。切記:沒有業務方配合的緩存頭輸出,再強的 Squid 也只是昂貴的 TCP 連接池。