Web Performance

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.

4 lượt xem Cập nhật: 31/05/2026

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)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.

  1. 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>
  2. Nginx:
    • Mở file cấu hình (thường là /etc/nginx/nginx.conf hoặc trong server{} 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;
  3. Cloudflare:
    • Vào Speed > Optimization, bật Auto MinifyBrotli. Cloudflare tự động chọn giữa Gzip và Brotli tuỳ trình duyệt.
  4. 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òng Header append Vary Accept-Encoding (Apache) hoặc add_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ằng nginx -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.