用 Squid 搭建本地 CDN 緩存代理爲網頁提速

身處海外,經常遇到訪問國內網站速度緩慢。而且網站不對靜態文件進行瀏覽器緩存優化,每次刷新頁面都要重新加載所有資源文件,而且很多網站內嵌很多個 iframe,每一個都調用一下 jQuery 之類的重量級腳本,再加上 TCP 掉包失連頻繁發生,整體的加載效率之慢可想而知。

所以特地針對這種情況折騰了一個解決方案:在本地用 Squid 搭建一個 HTTP 緩存代理服務器,編寫緩存規則自動將常用網站的靜態文件長期緩存,第一次經過該代理加載成功後,Squid 會把資源緩存在硬盤,之後每次的相同請求都會直接將硬盤中的緩存返回給瀏覽器,不需要再向源地址請求資源。說白了就是本地搭建了一個 CDN 緩存服務器罷了。

Squid 在 Linux/Unix 下的安裝過程我就不講了。Windows 下的安裝過程有些坑要提一提。

首先下載 Squid for Windows,安裝完後運行 Squid Server Tray,會在系統托盤出現 Squid 圖標。右鍵 Stop Squid Service,但後 Open Squid Configuration,按照下面的配置模板寫好 Squid 配置。

# Squid 監聽的 HTTP Proxy 端口
http_port 3128

# 緩存目錄。參數:
# cache_dir Type Directory Mbytes L1 L2 [options]
#   - Type: 緩存數據格式,建議使用 aufs
#   - Directory: 目錄地址,因爲 Squid for Windows 是運行
#     在 Cygwin 虛擬 POSIX 環境中,如果你想要設置的目錄是
#     D:\Squid\cache,則寫成 /cygdrive/d/Squid/cache
#   - Mbytes: 緩存大小限制(MB)
#   - L1, L2: 緩存目錄一級二級文件夾數目,建議保持默認值
cache_dir aufs /cygdrive/d/Squid/cache 20480 16 256

# 在這部分添加常用網站的緩存規則。參數:
# refresh_pattern [-i] regex min percent max [options]
#   - -i: 正則匹配忽略大小寫
#   - regex: 緩存規則對應的正則表達式,用來匹配請求 URL,
#     如果匹配成功則使用該規則處理請求
#   - min: 該規則對資源緩存至少多少分鐘,對動態內容建議
#     設爲 0,靜態內容則越大越好
#   - percent: 該資源至少緩存上次生命週期的百分比
#   - max: 該規則對資源緩存最大多少分鐘
# 對於 options,推薦使用 override-expire ignore-no-store
# ignore-private ignore-reload 的組合強制進行靜態資源緩存
# - 參考 http://www.luocheng.cn/article-view-209.html

refresh_pattern ^https?://...\.bdstatic\.com/ 43200 90% 432000 override-expire ignore-no-store ignore-private ignore-reload  
refresh_pattern ^https?://assets\.xxxxx\.com 43200 90% 432000 override-expire ignore-no-store ignore-private ignore-reload  
refresh_pattern . 0 20% 4320

# 定義一個叫 localnet 的 IP 組,包含所有內網地址
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network  
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network  
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network  
acl localnet src fc00::/7       # RFC 4193 local private network range  
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

# 允許本地連接通過代理
http_access allow localhost manager localnet  
http_access allow localnet  
http_access allow localhost

# 防止 Squid 在 HTTP Request Header 中亂添加東西
# 導致某些網站檢測到 Proxy 特徵而禁止訪問
via off  
forwarded_for delete  
log_mime_hdrs on  
header_access User-Agent allow all

# 崩潰時 coredumps 目錄,建議保留默認
coredump_dir /var/cache/squid

# 設置 DNS 服務器
dns_nameservers 8.8.8.8 208.67.222.222

# 限制 Squid 的文件句柄數,Windows 有一定限制,不要改動
max_filedescriptors 3200  

請務必將所有中文註釋刪掉,然後將該配置文件保存爲 ANSI 文本文件,Squid 不支持 Unicode 配置文件。然後運行桌面上的 Squid Terminal 程序,執行 squid -z 初始化緩存目錄。如果出現類似

FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (17) File exists  

這樣的錯誤,請到 Squid 安裝目錄,刪除 dev/shm/ 目錄下的所有文件再重新執行上述命令。

然後再 Start Squid Service,緩存代理服務器就應該架好了。

接下來在你的瀏覽器配置 HTTP 代理,感受一下緩存加速的效果吧。

Rix

Read more posts by this author.