什麼是 Varnish Cache:Varnish Cache Server 安裝與基本設定

測試環境 RHEL 系列AlmaLinux 9.8root 帳號2026-10-16 確認

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 -V
varnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish Software

RHEL 系列的套件保留開發專案已停止支援的 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.service
ExecStart=/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 & 推薦內容

若在 VCL 中把保存時間設為 10 分鐘,這 10 分鐘內都會用快取中修改前的頁面回應。想在儲存文章時立即清除快取,需要處理 PURGE 請求的 VCL 規則,以及 Proxy Cache Purge 之類的外掛。在 VCL 中要限制只接受從同一台伺服器送出的 PURGE 請求。

如果網頁伺服器不經過 PHP 就直接送出快取外掛產生的 HTML 檔案,Varnish 等於把同樣的事再做一次。如果快取的頁面仍要經過 PHP 才回應,Varnish 會在前面回應,減少 PHP 的執行。

即使看不到標頭,網站也可能在使用 Varnish,因為伺服器管理者有時會更改回應標頭的名稱或將其刪除。在開啟 Varnish 的 Cloudways 伺服器上,WordPress 的回應帶的是 [x-cache: HIT] 與 [age] 標頭,而不是 [X-Varnish]。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 4   +   8   =