Cơn ác mộng “High Traffic” và nỗi lo sập server
Hãy tưởng tượng website của bạn đang chạy ổn định thì bỗng dưng “lăn đùng ra chết”. Nguyên nhân có thể do một bài viết vừa viral hoặc chiến dịch quảng cáo đang đổ traffic về. Mình từng thức trắng đêm xử lý một con VPS liên tục báo lỗi 502 Bad Gateway. Dù đã nâng cấp RAM từ 4GB lên 16GB, CPU vẫn cứ nhảy vọt lên 100% không kiểm soát.
Vấn đề thực tế không nằm ở server yếu. Nó nằm ở cách hệ thống xử lý yêu cầu. Mỗi lượt truy cập, Nginx phải gọi PHP-FPM, PHP lại truy vấn MySQL rồi mới trả về kết quả. Quy trình này lặp lại hàng nghìn lần khiến tài nguyên cạn kiệt cực nhanh.
Tại sao server cấu hình mạnh vẫn bị ì ạch?
Phần lớn nội dung trên blog hoặc trang sản phẩm thường ít thay đổi. Việc bắt server thực thi code PHP và truy vấn database liên tục cho cùng một nội dung là sự lãng phí rất lớn.
Thủ phạm chính là I/O Wait và CPU Overload. Ngay cả khi bạn dùng FastCGI Cache của Nginx, hiệu năng vẫn có giới hạn khi gặp lượng request đồng thời (concurrent) quá lớn. Lúc này, chúng ta cần một lớp đệm chuyên dụng hơn để gánh tải.
Ba hướng giải quyết phổ biến hiện nay
Khi đối mặt với bài toán hiệu năng, các anh em kỹ thuật thường chọn một trong ba hướng sau:
- Nâng cấp phần cứng: Cách này nhanh nhưng tốn kém. Bạn không thể tăng RAM mãi được, và nó không giải quyết gốc rễ việc xử lý dư thừa.
- Dùng Object Cache (Redis/Memcached): Giúp Database “dễ thở” hơn. Tuy nhiên, PHP vẫn phải chạy để lấy dữ liệu từ Redis, nghĩa là CPU vẫn phải làm việc liên tục.
- Dùng Reverse Proxy Cache: Đây là giải pháp hiệu quả nhất. Một lớp đệm đứng trước web server, lưu HTML vào RAM và trả về ngay lập tức cho người dùng.
Varnish Cache – “Trạm trung chuyển” siêu tốc
Varnish Cache là một HTTP accelerator cực mạnh. Hãy coi nó như một máy bán hàng tự động. Khi khách yêu cầu một trang web, Varnish kiểm tra xem trong RAM đã có bản sao chưa. Nếu có (Cache Hit), nó trả về ngay trong khoảng 10-50ms. Nếu chưa có (Cache Miss), nó mới chuyển yêu cầu đến Nginx.
Kinh nghiệm triển khai thực tế của mình cho thấy: Một website WordPress thông thường có thể chịu tải gấp 20 lần sau khi cài Varnish mà CPU vẫn duy trì dưới mức 10%. Dưới đây là cách mình kết hợp Varnish với Nginx trên Ubuntu.
Hướng dẫn cài đặt chi tiết
Bước 1: Cài đặt Nginx và Varnish
Trước tiên, hãy cập nhật hệ thống và cài đặt các gói cần thiết bằng lệnh sau:
sudo apt update
sudo apt install nginx varnish -y
Bước 2: Chuyển Nginx thành Backend
Mặc định Nginx chạy trên port 80. Chúng ta sẽ đẩy Varnish ra “tiền tuyến” (port 80) và lùi Nginx về sau (port 8080).
Mở file cấu hình website của bạn (thường là file default):
sudo nano /etc/nginx/sites-available/default
Sửa listen 80; thành listen 8080;. Đừng quên sửa cả dòng IPv6 nếu có:
server {
listen 8080 default_server;
listen [::]:8080 default_server;
# ... giữ nguyên các cấu hình khác ...
}
Sau đó, kiểm tra cú pháp và khởi động lại Nginx:
sudo nginx -t
sudo systemctl restart nginx
Bước 3: Cấu hình Varnish lắng nghe Port 80
Bây giờ, chúng ta cần bảo Varnish hãy đón khách ở port 80 và lấy dữ liệu từ Nginx ở port 8080.
Sửa file cấu hình dịch vụ của Varnish:
sudo systemctl edit --full varnish
Tìm dòng ExecStart, đổi -a :6081 thành -a :80:
ExecStart=/usr/sbin/varnishd -a :80 -a localhost:8443,PROXY -f /etc/varnish/default.vcl -s malloc,512m
Mẹo nhỏ: Tham số -s malloc,512m dành 512MB RAM để lưu cache. Nếu server có 8GB RAM trở lên, bạn có thể mạnh dạn tăng lên 1g hoặc 2g.
Tiếp theo, trỏ Varnish về backend Nginx trong file VCL:
sudo nano /etc/varnish/default.vcl
Kiểm tra block backend để đảm bảo thông số như sau:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Cuối cùng, restart lại dịch vụ:
sudo systemctl daemon-reload
sudo systemctl restart varnish
Giải quyết bài toán SSL (HTTPS)
Varnish không hỗ trợ HTTPS trực tiếp. Để xử lý, chúng ta dùng mô hình SSL Termination.
Luồng dữ liệu sẽ là: User (Port 443) -> Nginx (Xử lý SSL) -> Varnish (Port 80) -> Nginx (Backend – Port 8080). Cách này giúp bạn vừa có chứng chỉ xanh an toàn, vừa tận dụng được tốc độ xé gió của Varnish.
Bạn chỉ cần cấu hình một server block Nginx lắng nghe port 443, cài Let’s Encrypt và dùng proxy_pass đẩy yêu cầu sang http://127.0.0.1:80.
Kiểm tra hiệu quả thực tế
Để xác nhận Varnish đã chạy, hãy dùng lệnh curl để xem Header:
curl -I http://your-domain.com
Nếu thấy dòng Via: 1.1 varnish, hệ thống đã thông suốt. Để theo dõi chi tiết hơn, hãy dùng lệnh varnishstat. Công cụ này hiển thị tỉ lệ Hit/Miss theo thời gian thực, giúp bạn biết được bao nhiêu phần trăm request đã được phục vụ từ RAM.
Lời kết
Triển khai Varnish không quá phức tạp. Tuy nhiên, bạn cần tinh chỉnh file default.vcl để không cache nhầm trang quản trị (như wp-admin) hoặc các trang thanh toán.
Hãy bắt đầu với cấu hình cơ bản này. Sau đó, tùy vào mã nguồn (WordPress hay Laravel) mà bạn sẽ bổ sung các quy tắc loại trừ cookie. Với cặp bài trùng Nginx và Varnish, server của bạn sẽ đủ sức cân hàng triệu lượt truy cập mỗi ngày mà không tốn thêm chi phí phần cứng.

