Bật HTTP/3 và nén Brotli trên Nginx 2026

Người dùng mobile ngày càng nhiều, kết nối mạng ngày càng phức tạp. HTTP/2 không còn tối ưu cho mọi tình huống, nhất là khi mất gói tin trên TCP. Giải pháp là nâng cấp lên HTTP/3 dựa trên QUIC (UDP) kết hợp nén Brotli. Bạn sẽ thấy tốc độ tải trang cải thiện rõ rệt, đặc biệt trên thiết bị di động và mạng có độ trễ cao. Bài viết này hướng dẫn chi tiết cách bật cả hai trên Nginx chạy Ubuntu 24.04.
- HTTP/3 (QUIC): Giao thức truyền tải dựa trên UDP, giảm số lần bắt tay, chịu mất gói tốt hơn TCP.
- Brotli: Thuật toán nén hiện đại hơn gzip, tỉ lệ nén cao hơn 20-30% cho nội dung văn bản (HTML, CSS, JS).
- Kết quả: Giảm dung lượng tải, giảm thời gian chờ, cải thiện điểm Core Web Vitals.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS (có thể dùng Debian 12 hoặc AlmaLinux 9 với lệnh tương ứng).
- User sudo không phải root.
- Domain đã trỏ DNS về IP VPS (A record).
- Nginx phiên bản 1.25.x trở lên (có module HTTP/3 built-in) hoặc tự compile. Bài này dùng Nginx từ repo chính thức.
- Cổng UDP 443 mở trên firewall.
Vì sao nên bật HTTP/3 và Brotli ngay bây giờ?
HTTP/3 giải quyết vấn đề head-of-line blocking của HTTP/2 trên TCP. Khi một gói tin TCP bị mất, toàn bộ luồng phải chờ, gây trễ. QUIC chạy trên UDP, mỗi luồng độc lập, mất một luồng không ảnh hưởng luồng khác. Kết quả: kết nối ổn định hơn trên mạng 3G/4G, WiFi không ổn định, hoặc khi chuyển mạng (ví dụ từ WiFi sang 4G).
Brotli từng là vấn đề vì tốn CPU giải nén, nhưng phần cứng hiện nay (ngay cả VPS 2GB RAM) xử lý rất nhẹ. Tỉ lệ nén Brotli (level 4-5) đã ngang ngửa gzip level 9, nhưng nhanh hơn. Kết hợp cả hai, bạn giảm được 20-30% dung lượng truyền tải cho tài nguyên tĩnh, website mở nhanh hơn rõ rệt.
Google đã dùng HTTP/3 cho các dịch vụ của mình từ năm 2020. Cloudflare, Akamai, Fastly đều hỗ trợ. Nếu bạn muốn website cạnh tranh được trên bảng xếp hạng tìm kiếm, đây là bước không thể bỏ qua.
Bước 1 - Cài đặt Nginx từ repo chính thức (bản mới)
Ubuntu 24.04 đi kèm Nginx 1.24, chưa hỗ trợ HTTP/3 built-in. Bạn cần cài từ repo chính thức của Nginx để có bản 1.26 có sẵn module ngx_http_v3_module.
Thêm repo Nginx và cài đặt:
sudo apt update
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install -y nginx
Kiểm tra phiên bản:
nginx -v
# Ouput: nginx version: nginx/1.26.x
Kiểm tra module HTTP/3:
nginx -V 2>&1 | grep -o http_v3_module
# Nếu có dòng "http_v3_module" là OK. Nếu không, bạn phải tự compile Nginx với flag --with-http_v3_module.
Lưu ý: Nếu bạn dùng VPS từ các nhà cung cấp như thuê VPS Linux, thường có sẵn Ubuntu 24.04, bạn chỉ việc chạy lệnh trên. Nếu dùng VPS cấu hình thấp (1GB RAM), quá trình compile Nginx thủ công sẽ lâu và dễ OOM, nên dùng repo chính thức.
Bước 2 - Cấu hình HTTP/3 (QUIC) trên Nginx
HTTP/3 chạy trên UDP, yêu cầu mở cổng 443 UDP trên firewall. Đồng thời bạn cần cấu hình server block để lắng nghe cả TCP (HTTP/1.1, HTTP/2) và QUIC (HTTP/3).
Mở file cấu hình site (ví dụ /etc/nginx/conf.d/domain.conf hoặc /etc/nginx/sites-available/domain):
server {
listen 443 ssl; # HTTP/1.1 + HTTP/2
listen 443 quic reuseport; # HTTP/3 (QUIC)
http2 on; # Bật HTTP/2 để fallback
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
# Alt-Svc: khai báo client biết server hỗ trợ HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
# Chỉ định giao thức SSL cho HTTP/3
ssl_protocols TLSv1.3; # QUIC yêu cầu TLS 1.3
ssl_early_data on; # 0-RTT (giảm thêm latency)
# Phần còn lại của server block (root, index, location...)
}
Giải thích:
listen 443 quic reuseport: Cho phép nhiều worker process chia sẻ cùng port QUIC, tăng hiệu năng.Alt-Svc h3=":443": Báo cho trình duyệt biết server hỗ trợ HTTP/3, lần sau chúng sẽ thử QUIC trước.ssl_early_data on: Cho phép dữ liệu 0-RTT, giúp request đầu tiên không cần chờ handshake hoàn tất.
Cảnh báo: 0-RTT dễ bị tấn công replay. Nếu ứng dụng của bạn nhạy cảm với replay (ví dụ thanh toán, đặt hàng), hãy cân nhắc tắt hoặc kiểm tra idempotency tại ứng dụng.
Sau đó kiểm tra cấu hình và reload Nginx:
sudo nginx -t
sudo systemctl reload nginx
Kiểm tra xem cổng UDP 443 có lắng nghe không:
ss -ulpn | grep :443
# Nên thấy dạng: udp UNCONN 0 0 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=...,fd=...))
Kiểm tra từ xa bằng curl (dùng bản curl 7.66+):
curl --http3 -I https://yourdomain.com
# Nếu trả về HTTP/3 200 OK là thành công.
Bước 3 - Cài đặt module Brotli cho Nginx
Nginx từ repo chính thức không có sẵn module Brotli. Có 2 cách: cài gói có sẵn (nếu có) hoặc compile module động. Cách đơn giản nhất là dùng repo của ngx_brotli và compile module động. Cách này không làm hỏng bản Nginx sẵn có.
# Cài build dependencies
sudo apt install -y git libpcre3-dev zlib1g-dev libssl-dev
# Clone repo ngx_brotli và submodule
git clone --recursive https://github.com/google/ngx_brotli.git
cd ngx_brotli
# Compile module động (cần phiên bản Nginx trùng với phiên bản hiện tại)
sudo /usr/sbin/nginx -V 2>&1 | grep 'configure arguments' | sed 's/configure arguments: //' | sed 's/ --add-dynamic-module[^ ]*//g' > /tmp/nginx_opts
cd ..
wget http://nginx.org/download/nginx-1.26.0.tar.gz # thay số đúng với phiên bản bạn đang dùng
tar -xzf nginx-1.26.0.tar.gz
cd nginx-1.26.0
./configure $(cat /tmp/nginx_opts) --add-dynamic-module=../ngx_brotli
make -j$(nproc) modules
sudo cp objs/ngx_http_brotli_filter_module.so /usr/lib/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /usr/lib/nginx/modules/
Tải module trong /etc/nginx/nginx.conf (thêm vào đầu file, trong khối events hoặc ngay sau user):
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
Kiểm tra Nginx còn chạy được không:
sudo nginx -t
Nếu lỗi "module not found" hoặc phiên bản không khớp, bạn cần compile lại module với đúng phiên bản Nginx. Dùng lệnh nginx -v để lấy số hiệu.
Bước 4 - Cấu hình nén Brotli
Trong server block hoặc trong khối http của Nginx (để áp dụng toàn site), thêm:
http {
# ... các cấu hình khác
brotli on;
brotli_level 4; # Cân bằng giữa tỉ lệ nén và tốc độ
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
brotli_static on; # Dùng file .br đã nén sẵn nếu có
# Vẫn giữ gzip cho các client cũ
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
Giải thích:
brotli_level 4: Level nén 4 cho tỉ lệ nén tốt (giảm ~25% so với gzip) mà CPU không quá tải. Trên VPS 2-4GB RAM, level 6 vẫn ổn.brotli_static on: Nếu bạn có file .br được nén sẵn (ví dụ khi build frontend), Nginx sẽ serve file đó thay vì nén realtime.- Brotli và gzip cùng bật: Trình duyệt gửi header
Accept-Encoding: br, gzipsẽ ưu tiên Brotli. Trình duyệt cũ chỉ hiểu gzip vẫn được phục vụ.
Reload Nginx:
sudo systemctl reload nginx
Kiểm tra Brotli đã hoạt động:
curl -H "Accept-Encoding: br" -I https://yourdomain.com | grep content-encoding
# Phải thấy: content-encoding: br
Bước 5 - Kiểm tra tổng thể và tối ưu thêm
Dùng công cụ online để kiểm tra HTTP/3 và Brotli:
- https://http3check.net/ - Kiểm tra HTTP/3 chính xác.
- https://tools.keycdn.com/brotli-test - Kiểm tra Brotli.
- Google PageSpeed Insights hoặc Lighthouse (bản mới) để xem cải thiện.
Một số tối ưu bổ sung:
- Bật OCSP stapling để tăng tốc handshake SSL.
- Dùng session ticket để giảm thời gian bắt tay lại.
- Nếu site dùng nhiều tài nguyên tĩnh, hãy tạo file .br sẵn trong quá trình build (ví dụ với webpack plugin compression-webpack-plugin có hỗ trợ brotli).
Xử lý lỗi thường gặp
Lỗi "quic" directive is not allowed here
Do Nginx bản cũ (1.24 trở xuống) không hỗ trợ. Phải cài từ repo chính thức hoặc compile với --with-http_v3_module. Luôn kiểm tra nginx -V | grep http_v3_module.
Curl --http3 báo lỗi "option --http3: is unknown"
Bạn cần curl 7.66+ và NSS/OpenSSL hỗ trợ QUIC. Ubuntu 24.04 có sẵn curl 8.x. Nếu vẫn lỗi, cài bản mới hơn:
sudo apt install -y curl
Brotli module báo "module not found" khi nginx -t
Nginx không tìm thấy file .so. Kiểm tra đường dẫn trong load_module có đúng không. File .so phải nằm trong thư mục /usr/lib/nginx/modules/. Dùng ls -l /usr/lib/nginx/modules/ngx_http_brotli_*.so để xác nhận.
Câu hỏi thường gặp
HTTP/3 có cần SSL không?
Có. HTTP/3 bắt buộc dùng TLS 1.3. Bạn cần chứng chỉ SSL hợp lệ, có thể dùng Let's Encrypt miễn phí qua Certbot. QUIC không thể chạy nếu thiếu SSL.
Có nên tắt gzip khi đã bật Brotli?
Không nên tắt hoàn toàn. Một số trình duyệt cũ (IE 11, Android Browser cũ) không hỗ trợ Brotli. Cứ bật cả hai, Nginx tự động chọn theo header Accept-Encoding của client.
Brotli có tốn CPU không?
Có, nhưng không đáng kể với phần cứng hiện tại. Level 4-5 trên VPS 2GB RAM (Intel Xeon E5-2670) chỉ tốn thêm 2-5% CPU. Nếu workload rất cao (hàng ngàn request/s), bạn nên dùng brotli_static on với file pre-compressed.
Làm sao biết trình duyệt của tôi đã dùng HTTP/3?
Mở DevTools (F12) → tab Network → click vào request → tìm header Alt-Svc hoặc trong cột Protocol thấy h3. Trên Chrome, vào chrome://net-export/ để xem log chi tiết.
Có cần mở thêm port nào không?
Chỉ cần port 443 UDP cho QUIC. Port 80 TCP vẫn cần cho redirect HTTP→HTTPS. Đảm bảo firewall mở cả UDP 443: sudo ufw allow 443/udp.
Bài viết liên quan
- Cài đặt và tối ưu Nginx làm reverse proxy trên Ubuntu 24.04
- Tối ưu Nginx cho traffic cao: worker, gzip, buffer, cache
- Tăng tốc WordPress bằng LiteSpeed và LSCache trên VPS
- Tối ưu PHP-FPM cho WordPress trên VPS


