Tăng tốc website ‘thần tốc’ với Varnish Cache và Nginx trên CentOS Stream 9

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Tăng tốc website bằng Varnish Cache: Giải pháp thực chiến cho CentOS Stream 9

Website load chậm là con đường ngắn nhất khiến người dùng rời bỏ bạn và bị Google hạ bậc xếp hạng. Mình từng quản lý hệ thống thương mại điện tử chạy CentOS 7 với lượng truy cập cực lớn. Dù đã tối ưu Nginx và PHP-FPM, server vẫn liên tục “thở dốc” mỗi khi vào mùa sale. Sau khi đưa Varnish Cache lên đứng trước Nginx, kết quả thực sự khác biệt. CPU server giảm ngay từ 80% xuống còn vỏn vẹn 5-10%, trong khi tốc độ phản hồi trang (TTFB) chỉ còn tính bằng mili giây.

Dưới đây là cách mình triển khai mô hình này trên CentOS Stream 9. Đây là lựa chọn ổn định nhất hiện nay để thay thế cho CentOS 7 đã khai tử.

Quick Start: Cài đặt nhanh trong 5 phút

Nếu bạn đang có một server CentOS Stream 9 mới tinh, hãy thực hiện các lệnh sau để thấy ngay hiệu quả.

Bước 1: Cài đặt Nginx và Varnish

# Cài đặt EPEL repository
sudo dnf install epel-release -y

# Cài đặt Nginx và Varnish
sudo dnf install nginx varnish -y

# Kích hoạt dịch vụ
sudo systemctl enable --now nginx
sudo systemctl enable --now varnish

Bước 2: Chuyển Nginx sang port 8080

Thông thường Nginx chiếm port 80, nhưng chúng ta cần nhường vị trí này cho Varnish. Bạn hãy mở file cấu hình Nginx và sửa lại port:

sudo sed -i 's/listen       80;/listen       8080;/g' /etc/nginx/nginx.conf
sudo systemctl restart nginx

Bước 3: Cấu hình Varnish hứng request tại port 80

Để Varnish làm nhiệm vụ “tiền tuyến”, bạn cần thay đổi port mặc định của nó:

sudo systemctl edit --full varnish.service

Hãy tìm dòng ExecStart, đổi port 6081 thành 80. Lưu ý giữ nguyên các tham số khác:

ExecStart=/usr/sbin/varnishd -a :80 -f /etc/varnish/default.vcl -s malloc,256m

Cuối cùng, hãy nạp lại cấu hình và khởi động lại dịch vụ:

sudo systemctl daemon-reload
sudo systemctl restart varnish

Lúc này, Varnish đã sẵn sàng nhận request từ người dùng và đẩy về Nginx ở port 8080 khi cần thiết.

Tại sao mô hình này lại giúp server “nhàn” hơn?

Varnish Cache đóng vai trò như một bộ nhớ đệm cực nhanh. Thay vì để Nginx phải gọi PHP xử lý và truy vấn Database liên tục, Varnish sẽ lưu bản sao kết quả vào RAM. Khi có người truy cập tiếp theo, Varnish trả kết quả ngay lập tức. Điều này giúp hệ thống chịu tải được hàng chục nghìn request mỗi giây mà không cần nâng cấp phần cứng đắt tiền.

Tối ưu logic với VCL (Varnish Configuration Language)

Mọi sức mạnh của Varnish nằm ở file /etc/varnish/default.vcl. Đây là cấu hình mình thường dùng để tối ưu cho các website tin tức hoặc bán hàng:

vcl 4.1;

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

sub vcl_recv {
    # Chỉ cache các request GET và HEAD để đảm bảo an toàn
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }

    # Loại bỏ cookie cho file tĩnh để tăng tỷ lệ Hit Cache
    if (req.url ~ "\.(jpg|jpeg|gif|png|css|js|ico|gz|svg|woff2)$") {
        unset req.http.Cookie;
        return (hash);
    }

    # Bỏ qua cache cho trang quản trị
    if (req.url ~ "^/wp-admin" || req.url ~ "^/wp-login.php") {
        return (pass);
    }
}

Lưu ý nhỏ: Bạn cần đặc biệt chú ý đến Cookie. Nếu không xử lý khéo, Varnish sẽ nhầm lẫn giữa các phiên đăng nhập của người dùng khác nhau.

Giải quyết bài toán HTTPS (SSL Termination)

Varnish có một điểm yếu là không hỗ trợ giao thức HTTPS trực tiếp. Để giải quyết, chúng ta sử dụng mô hình “Sandwich”: Client (443) -> Nginx (Giải mã SSL) -> Varnish (80) -> Nginx (8080).

Đừng quá lo lắng về độ phức tạp, cấu hình Nginx cho port 443 sẽ đơn giản như sau:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:80; # Đẩy request đã giải mã vào Varnish
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Kinh nghiệm thực chiến khi vận hành

1. Theo dõi chỉ số Hit Rate: Hãy sử dụng lệnh varnishstat thường xuyên. Một hệ thống được cấu hình tốt thường có tỷ lệ main_cache_hit đạt trên 80%. Nếu con số này quá thấp, bạn cần xem lại logic loại bỏ Cookie trong file VCL.

2. Xử lý rào cản SELinux: Trên CentOS Stream 9, SELinux rất nghiêm ngặt. Nếu Varnish không thể kết nối tới backend, đừng vội tắt SELinux. Hãy chạy lệnh: setsebool -P httpd_can_network_connect 1 để mở đường cho chúng thông tin với nhau.

3. Cơ chế xóa cache (Purge): Khi bạn cập nhật bài viết, Varnish vẫn sẽ hiển thị nội dung cũ. Bạn nên cài đặt plugin (như Proxy Cache Purge trên WordPress) để tự động dọn dẹp cache ngay khi nhấn nút “Cập nhật”.

Việc kết hợp Varnish và Nginx giống như việc lắp thêm bộ tăng áp cho động cơ xe. Nó không chỉ giúp website chạy nhanh hơn mà còn là lớp giáp bảo vệ server trước những đợt traffic tăng đột biến. Chúc các bạn triển khai thành công!

Share: