Varnish Cache là gì: cài đặt và cấu hình cơ bản Varnish Cache Server

Môi trường thử nghiệm Họ RHELAlmaLinux 9.8Tài khoản rootKiểm tra ngày 2026-10-16

Varnish Cache là bộ nhớ đệm reverse proxy đặt trước máy chủ web, lưu phản hồi HTTP trong bộ nhớ rồi trả lời các yêu cầu giống nhau mà không cần qua máy chủ gốc. Khi chúng tôi đặt Varnish 6.6.2 trước WordPress trên máy chủ AlmaLinux 9.8, trang không được lưu đệm vì max-age=0, và chúng tôi đã khắc phục bằng cách đặt thời gian lưu trong VCL.

Yêu cầu nào được lưu đệm và lưu trong bao lâu được viết trong tệp VCL (Varnish Configuration Language).

1️⃣ Khái niệm Varnish Cache: bộ nhớ đệm reverse proxy

Với mỗi yêu cầu, Varnish trước hết kiểm tra xem đã có phản hồi được lưu hay chưa. Nếu trả lời bằng phản hồi đã lưu thì đó là cache hit (HIT); nếu phải lấy phản hồi từ máy chủ gốc (backend) thì đó là cache miss (MISS). Phản hồi lấy về khi miss được lưu trong suốt thời gian lưu và dùng cho các yêu cầu tiếp theo.

Varnish mã nguồn mở không hỗ trợ TLS nên không thể nhận trực tiếp yêu cầu HTTPS. Ở cổng 443, Nginx hoặc HAProxy xử lý TLS rồi chuyển yêu cầu cho Varnish.

Dự án mã nguồn mở Varnish Cache đã đổi tên thành Vinyl Cache từ phiên bản 9.0 ra mắt vào tháng 3 năm 2026. Tên Varnish Cache vẫn được dùng tiếp cho phiên bản mà Varnish Software phân phối kèm thêm tính năng TLS.

2️⃣ Cài đặt Varnish Cache Server

Trên AlmaLinux 9, bạn cài bằng gói varnish trong kho mặc định (AppStream), và phiên bản của gói này là Varnish 6.6.2 từ trước khi đổi tên.

dnf -y install varnish

Sau khi cài xong, hãy kiểm tra phiên bản bằng [varnishd -V].

varnishd -V
varnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish Software

Các gói thuộc họ RHEL giữ nguyên phiên bản 6.6.2 mà dự án đã ngừng hỗ trợ và chỉ phân phối kèm các bản sửa lỗi bảo mật. Gói 6.6.2-7 ra mắt vào tháng 6 năm 2025 có bản sửa lỗ hổng HTTP request smuggling (CVE-2025-47905).

Khi cài đặt, [/etc/varnish/default.vcl] và [/usr/lib/systemd/system/varnish.service] cũng được tạo ra.

grep ExecStart= /usr/lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m

[-a :6081] chỉ định cổng nhận yêu cầu, còn [-s malloc,256m] chỉ định 256MB bộ nhớ dùng làm không gian lưu bộ nhớ đệm.

3️⃣ Cấu hình cơ bản: backend và cổng

Tệp VCL mặc định [/etc/varnish/default.vcl] ngay từ đầu đã đặt cổng 8080 trên cùng máy chủ làm backend.

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Với Apache, hãy đổi giá trị [Listen] trong [httpd.conf] thành 8080 để Apache nhận các yêu cầu mà Varnish chuyển tới.

# /etc/httpd/conf/httpd.conf
Listen 8080

Với trang web dùng HTTPS, hãy giữ Varnish ở cổng 6081 và kết nối Nginx, vốn xử lý TLS, để Nginx chuyển yêu cầu cho Varnish.

Cấu hình để Varnish nhận yêu cầu trực tiếp ở cổng 80 phù hợp với trang web chỉ dùng HTTP. Khi đó, hãy tạo bản sao tệp dịch vụ theo tài liệu cài đặt của Varnish Software rồi đổi 6081 thành 80 ở dòng [ExecStart].

systemctl edit --full varnish

Bản sao bạn lưu trong trình soạn thảo được tạo tại [/etc/systemd/system/varnish.service], và cổng đã đổi vẫn được giữ nguyên dù bạn cập nhật gói.

systemctl enable --now varnish

Dù chọn cấu hình nào, cuối cùng hãy dùng lệnh enable với tùy chọn now để đăng ký tự khởi động khi boot, đồng thời chạy Varnish ngay.

4️⃣ Kiểm tra hoạt động: header X-Varnish và Age

Sau khi chạy Varnish, hãy kiểm tra header phản hồi để xem trang WordPress có thực sự đến từ bộ nhớ đệm hay không. Yêu cầu được gửi thẳng tới cổng 6081 của Varnish mà không qua Nginx, vì vậy tên miền và việc có dùng HTTPS hay không được đưa vào bằng header [Host] và [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] là số mà Varnish gắn cho yêu cầu, còn [Via: 1.1 varnish] cho biết phản hồi đã đi qua Varnish. [Age] là thời gian (giây) kể từ khi phản hồi được lưu vào bộ nhớ đệm.

Gửi lại cùng yêu cầu sau 3 giây, [X-Varnish] vẫn chỉ có một số và [Age] là 0, nghĩa là máy chủ gốc lại trả lời. Quy tắc mà plugin bộ nhớ đệm thêm vào [.htaccess] gắn [max-age=0] cho HTML, nên cấu hình mặc định của Varnish tính thời gian lưu là 0 giây.

Yêu cầu có cookie cũng không đi qua bộ nhớ đệm với cấu hình mặc định. Cookie của công cụ phân tích lượt truy cập cũng vậy, nên mọi yêu cầu từ khách truy cập có những cookie này đều đi tới máy chủ gốc.

VCL bên dưới chuyển yêu cầu đăng nhập, yêu cầu quản trị và các yêu cầu không phải GET hay HEAD tới máy chủ gốc, còn các yêu cầu còn lại được xóa cookie rồi mới lưu đệm. Phản hồi có thời gian lưu 0 giây và không tạo cookie được lưu 10 phút, còn phản hồi yêu cầu không lưu như [no-cache] thì không được lưu.

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;
    }
}

Sau khi sửa tệp VCL, hãy tải lại bằng [systemctl reload varnish]. Bên dưới là phản hồi thứ hai trong hai lần gửi cùng một yêu cầu tới Varnish đã áp dụng VCL này.

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)

Yêu cầu thứ hai, gửi 3 giây sau khi áp dụng VCL, có hai số trong [X-Varnish] và [Age] là 3. Hai số nghĩa là bộ nhớ đệm đã trả lời, và số phía sau là số của yêu cầu đã lấy trang đó từ máy chủ gốc rồi lưu lại.

Yêu cầu gắn cookie đăng nhập chỉ có một số và được máy chủ gốc trả lời, còn yêu cầu chỉ gắn cookie của công cụ phân tích được trả lời từ bộ nhớ đệm.

🔢 FAQ & nội dung đề xuất

Nếu bạn đặt thời gian lưu là 10 phút trong VCL, trong 10 phút đó trang trước khi sửa đã lưu trong bộ nhớ đệm sẽ được trả về. Để xóa bộ nhớ đệm ngay khi lưu bài viết, bạn cần quy tắc VCL xử lý yêu cầu PURGE và một plugin như Proxy Cache Purge. Trong VCL, hãy giới hạn để chỉ nhận yêu cầu PURGE gửi từ cùng máy chủ.

Nếu máy chủ web gửi thẳng tệp HTML do plugin bộ nhớ đệm tạo ra mà không cần PHP, Varnish sẽ làm lại cùng một việc. Nếu trang đã lưu đệm vẫn phải qua PHP để trả lời, Varnish sẽ trả lời ở phía trước và giảm số lần chạy PHP.

Dù không thấy header, trang web vẫn có thể đang dùng Varnish, vì người vận hành máy chủ đôi khi đổi tên hoặc xóa header phản hồi. Trên máy chủ Cloudways đã bật Varnish, phản hồi của WordPress có header [x-cache: HIT] và [age] thay cho [X-Varnish].

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 5   +   8   =