什麼是 Varnish Cache:Varnish Cache Server 安裝與基本設定
Varnish Cache 是一種反向代理快取,位於網頁伺服器前方,把 HTTP 回應存在記憶體中,遇到相同請求時不經過來源伺服器就直接回應。我們在 AlmaLinux 9.8 伺服器上把 Varnish 6.6.2 放在 WordPress 前面時,頁面因 max-age=0 而沒有被快取,後來在 VCL 中指定保存時間解決了問題。
要快取哪些請求、保存多久,都寫在 VCL(Varnish Configuration Language)檔案中。
1️⃣ Varnish Cache 概念:反向代理快取
Varnish 會先確認每個請求是否有已儲存的回應。用已儲存的回應處理時是快取命中(HIT),需要從來源伺服器(後端)取得時則是快取未命中(MISS)。未命中時取得的回應會在保存時間內存起來,供之後的請求使用。
開源版 Varnish 不支援 TLS,因此無法直接接收 HTTPS 請求。在 443 連接埠上,由 Nginx 或 HAProxy 處理 TLS 後再把請求轉給 Varnish。
開源的 Varnish Cache 專案自 2026 年 3 月推出的 9.0 版起改名為 Vinyl Cache。Varnish Cache 這個名稱則由 Varnish Software 加上 TLS 功能後發行的版本繼續使用。
2️⃣ 安裝 Varnish Cache Server
在 AlmaLinux 9 上使用預設軟體庫(AppStream)的 varnish 套件安裝,這個套件的版本是改名前的 Varnish 6.6.2。
dnf -y install varnish安裝完成後,用 [varnishd -V] 確認版本。
varnishd -Vvarnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish SoftwareRHEL 系列的套件保留開發專案已停止支援的 6.6.2 版,只加上安全性修正後發行。2025 年 6 月推出的 6.6.2-7 套件包含 HTTP 請求走私(HTTP request smuggling)漏洞(CVE-2025-47905)的修正。
安裝後會一併建立 [/etc/varnish/default.vcl] 與 [/usr/lib/systemd/system/varnish.service]。
grep ExecStart= /usr/lib/systemd/system/varnish.serviceExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m[-a :6081] 指定接收請求的連接埠,[-s malloc,256m] 指定作為快取儲存空間的 256MB 記憶體。
3️⃣ 基本設定:後端與連接埠
預設的 VCL 檔案 [/etc/varnish/default.vcl] 一開始就把同一台伺服器的 8080 連接埠設為後端。
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}Apache 則把 [httpd.conf] 中的 [Listen] 值改為 8080,讓它接收 Varnish 轉來的請求。
# /etc/httpd/conf/httpd.conf
Listen 8080使用 HTTPS 的網站讓 Varnish 維持在 6081 連接埠,並設定處理 TLS 的 Nginx 把請求轉給 Varnish。
讓 Varnish 直接在 80 連接埠接收請求的架構,適合只使用 HTTP 的網站。這時依照 Varnish Software 的安裝文件建立服務檔案的副本,把 [ExecStart] 行中的 6081 改成 80。
systemctl edit --full varnish在編輯器中儲存的副本會建立在 [/etc/systemd/system/varnish.service],即使更新套件,改過的連接埠也會保留。
systemctl enable --now varnish不論採用哪種架構,最後都用 enable 指令加上 now 選項,在註冊開機自動啟動的同時立即執行 Varnish。
4️⃣ 確認運作:X-Varnish 與 Age 標頭
啟動 Varnish 後,用回應標頭確認 WordPress 頁面是否真的來自快取。請求不經過 Nginx,而是直接送到 Varnish 的 6081 連接埠,所以網域與是否為 HTTPS 要用 [Host] 與 [X-Forwarded-Proto] 標頭帶入。
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1001
Age: 0
Via: 1.1 varnish (Varnish/6.6)[X-Varnish] 是 Varnish 為請求加上的編號,[Via: 1.1 varnish] 表示回應經過了 Varnish。[Age] 是回應存入快取後經過的時間(秒)。
3 秒後再送一次相同請求,[X-Varnish] 編號仍只有一個,[Age] 為 0,這次也是來源伺服器回應。原因是快取外掛寫進 [.htaccess] 的規則替 HTML 加上了 [max-age=0],讓 Varnish 的預設設定把保存時間算成 0 秒。
帶有 Cookie 的請求在預設設定下也不會經過快取。流量分析工具的 Cookie 也一樣,因此帶有這類 Cookie 的訪客請求全都會送到來源伺服器。
下面的 VCL 會把登入與管理後台的請求,以及不是 GET 或 HEAD 的請求轉給來源伺服器,其餘請求則移除 Cookie 後再快取。保存時間為 0 秒且不建立 Cookie 的回應保存 10 分鐘,像 [no-cache] 這類要求不要保存的回應則不保存。
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
if (req.url ~ "^/(wp-admin|wp-login\.php)" || req.http.Cookie ~ "wordpress_logged_in_|wp-postpass_|comment_author_") {
return (pass);
}
unset req.http.Cookie;
}
sub vcl_backend_response {
if (beresp.ttl <= 0s && !beresp.http.Set-Cookie) {
set beresp.ttl = 10m;
}
}修改 VCL 檔案後,用 [systemctl reload varnish] 重新載入。下面是對套用此 VCL 的 Varnish 送出兩次相同請求所得結果中的第二個回應。
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1004 1002
Age: 3
Via: 1.1 varnish (Varnish/6.6)套用 VCL 後 3 秒送出的第二次請求,[X-Varnish] 有兩個編號,[Age] 為 3。有兩個編號表示由快取回應,後面的編號是從來源伺服器取得並儲存該頁面的那個請求的編號。
帶登入 Cookie 的請求只有一個編號,由來源伺服器回應;只帶分析工具 Cookie 的請求則由快取回應。
🔢 FAQ & 推薦內容
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。