Compression (Gzip/Brotli)
Thuật toán nén dữ liệu trên máy chủ để giảm kích thước phản hồi HTTP trước khi gửi đến trình duyệt.
Compression (Gzip/Brotli) là gì?
Compression (Gzip/Brotli) là kỹ thuật nén dữ liệu trên máy chủ trước khi gửi phản hồi HTTP đến trình duyệt người dùng. Mục đích chính là giảm kích thước file — như HTML, CSS, JavaScript, JSON — giúp truyền tải nhanh hơn qua mạng, đặc biệt trên kết nối chậm hoặc di động. Gzip và Brotli là hai thuật toán phổ biến nhất hiện nay, trong đó Gzip ra đời từ thập niên 1990, còn Brotli được Google phát triển năm 2015 và hỗ trợ rộng rãi từ Chrome 52 trở đi.
Tại sao quan trọng trong SEO?
Tốc độ tải trang là một yếu tố xếp hạng trực tiếp của Google trên cả desktop và mobile. Compression giúp giảm thời gian Time to First Byte (TTFB) và Content Download Time, từ đó cải thiện chỉ số Core Web Vitals như Largest Contentful Paint (LCP) và Total Blocking Time (TBT). Các trang nén tốt thường có tỷ lệ thoát thấp hơn, thời gian xem trang cao hơn và khả năng chuyển đổi tốt hơn — tất cả đều là tín hiệu gián tiếp ảnh hưởng đến thứ hạng tìm kiếm.
Theo báo cáo của HTTP Archive (tháng 6/2024), hơn 78% trang web top 1 triệu sử dụng Gzip, nhưng chỉ khoảng 32% đã bật Brotli — cho thấy tiềm năng tối ưu chưa được khai thác đầy đủ.
Cách hoạt động
Khi trình duyệt gửi yêu cầu HTTP, nó bao gồm tiêu đề Accept-Encoding liệt kê các định dạng nén mà nó hỗ trợ (ví dụ: gzip, br, deflate). Máy chủ kiểm tra tiêu đề này, chọn thuật toán phù hợp nhất (ưu tiên Brotli nếu có), nén nội dung phản hồi, rồi trả về với tiêu đề Content-Encoding: br hoặc Content-Encoding: gzip. Trình duyệt tự động giải nén dữ liệu trước khi xử lý — toàn bộ quá trình diễn ra trong tích tắc và không cần can thiệp từ người dùng hay lập trình viên.
Lưu ý: Chỉ nội dung văn bản (text-based) mới được nén hiệu quả — hình ảnh (JPEG, PNG), video hoặc PDF thường đã ở dạng nén nên không đạt lợi ích đáng kể khi nén thêm.
Hướng dẫn thực hiện
Dưới đây là cách bật nén trên các nền tảng phổ biến. Luôn kiểm tra sau khi cấu hình bằng công cụ như Varvy Gzip Test hoặc curl -I -H 'Accept-Encoding: br' https://example.com.
- Apache (qua .htaccess hoặc httpd.conf):
- Đảm bảo module
mod_deflateđã bật. - Thêm đoạn sau để bật Gzip:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json application/xml </IfModule>
- Đảm bảo module
- Nginx:
- Mở file cấu hình (thường là
/etc/nginx/nginx.confhoặc trongserver{}block). - Bật Gzip:
gzip on; gzip_types text/plain text/css application/javascript application/json application/xml; gzip_vary on;
- Bật Brotli (cần cài module
ngx_brotli):
brotli on; brotli_types text/plain text/css application/javascript application/json; brotli_static on;
- Mở file cấu hình (thường là
- Cloudflare:
- Vào Speed > Optimization, bật Auto Minify và Brotli. Cloudflare tự động chọn giữa Gzip và Brotli tuỳ trình duyệt.
- Vercel / Netlify:
- Được bật mặc định cho tài nguyên tĩnh (HTML, CSS, JS). Không cần cấu hình thủ công.
Lỗi thường gặp
- Nén trùng lặp: Một số CDN hoặc plugin (như WP Rocket) vừa nén trên máy chủ vừa nén trên CDN → gây lỗi giải nén. Cách khắc phục: Tắt nén ở một phía (ưu tiên CDN), hoặc kiểm tra tiêu đề
Vary: Accept-Encodingđể đảm bảo cache phân biệt đúng. - Thiếu tiêu đề Vary: Nếu máy chủ nén nhưng không gửi
Vary: Accept-Encoding, proxy hoặc CDN có thể lưu bản nén và trả cho trình duyệt không hỗ trợ → gây lỗi hiển thị. Cách khắc phục: Thêm dòngHeader append Vary Accept-Encoding(Apache) hoặcadd_header Vary Accept-Encoding;(Nginx). - Nén file đã nén: Áp dụng Gzip lên file JPEG hoặc SVG đã nén → tăng kích thước thay vì giảm. Cách khắc phục: Chỉ nén các loại MIME text-based, không áp dụng cho
image/*,video/*,application/pdf. - Brotli không hoạt động dù đã bật: Một số phiên bản Nginx cũ (< 1.11.6) hoặc máy chủ thiếu thư viện
libbrotli. Cách khắc phục: Kiểm tra bằngnginx -V 2>&1 | grep -o brotli; nâng cấp nếu cần.
Ví dụ thực tế
Một trang HTML gốc nặng 124 KB. Sau khi bật Gzip: còn 36 KB (giảm 71%). Cùng trang đó với Brotli mức độ nén cao (level 11): còn 29 KB (giảm 77%). Với trang chứa nhiều script (ví dụ: React bundle 420 KB), Brotli thường nhanh hơn Gzip 15–20% về tỉ lệ nén, và chậm hơn chút ít về tốc độ nén — nhưng điều này không ảnh hưởng đến trải nghiệm người dùng vì nén xảy ra một lần trên máy chủ.
Dưới đây là bảng so sánh hiệu quả nén điển hình trên tập dữ liệu chuẩn Silesia Corpus:
| Thuật toán | Tỉ lệ nén (so với gốc) | Tốc độ nén (MB/s) | Tốc độ giải nén (MB/s) |
|---|---|---|---|
| Gzip (level 6) | ~3,1x | ~25 | ~200 |
| Brotli (level 4) | ~3,5x | ~18 | ~190 |
| Brotli (level 11) | ~4,2x | ~1,2 | ~160 |
Lưu ý: Tỉ lệ nén và tốc độ phụ thuộc vào dữ liệu đầu vào, phần cứng máy chủ và phiên bản phần mềm — con số trong bảng mang tính tham khảo.
Câu hỏi thường gặp
Brotli có thay thế hoàn toàn Gzip không?
Không. Gzip vẫn cần thiết để hỗ trợ trình duyệt cũ (Internet Explorer, Safari dưới 11.1, một số trình duyệt Android cũ). Máy chủ nên cấu hình để ưu tiên Brotli nếu trình duyệt hỗ trợ, và quay lại Gzip nếu không — nhờ cơ chế Accept-Encoding. Đây là cách an toàn và phổ biến nhất.
Có nên nén mọi loại file không?
Không. Chỉ nên nén nội dung văn bản: HTML, CSS, JavaScript, JSON, XML, SVG (text-based), font WOFF2. Các định dạng nhị phân như JPEG, PNG, GIF, MP4, PDF hoặc WOFF1 không nên nén thêm — có thể làm file lớn hơn hoặc gây lỗi.
Compression có ảnh hưởng đến CPU máy chủ không?
Có, nhưng mức độ rất thấp với Gzip level 4–6 hoặc Brotli level 4–6. Trên máy chủ hiện đại, việc nén một file 100 KB mất vài mili giây. Với cache nén (nén một lần, lưu bản đã nén trên đĩa hoặc bộ nhớ), tải CPU gần như không đáng kể. Trường hợp dùng Brotli level 11 liên tục cho hàng nghìn request/giây trên máy chủ yếu có thể gây tải — tùy trường hợp.