Giới thiệu
Nếu bạn đã từng phải đối mặt với thời gian tải trang chậm chạp và đổ lỗi cho mạng, có thể bạn đã bỏ qua kẻ thủ phạm lớn nhất: nén máy chủ web không hiệu quả. Nginx đi kèm với hỗ trợ gzip tích hợp sẵn, và mô-đun Brotli do cộng đồng duy trì có thể giúp giảm thời gian phản hồi (TTFB) chỉ trong vài mili giây. Hướng dẫn này sẽ đưa bạn qua một danh sách kiểm tra theo phong cách SRE để kích hoạt, kiểm tra và tinh chỉnh cả hai bộ nén trên một hệ thống Ubuntu 22.04 LTS điển hình.
Tại sao nén lại quan trọng
- Giảm tải – gzip có thể cắt giảm kích thước HTML/CSS/JS từ 30-40%; Brotli thường đạt tới trên 50%.
- Giảm chi phí băng thông – đặc biệt quan trọng đối với các startup có ngân sách hạn chế cho dịch vụ đám mây.
- Cải thiện SEO – Google sử dụng tốc độ tải trang làm tín hiệu xếp hạng.
- Cải thiện trải nghiệm người dùng – người dùng di động trên các kết nối không ổn định sẽ cảm nhận sự khác biệt.
Nhưng nén không phải là một tính năng “cài đặt và quên”. Cấu hình sai bộ đệm, mức nén thấp, hoặc thiếu loại MIME có thể thực sự làm tăng độ trễ.
Yêu cầu
- Ubuntu 22.04 (hoặc bất kỳ bản phân phối Debian gần đây nào).
- Nginx 1.21+ được biên dịch với
ngx_http_brotli_filter_modulevàngx_http_brotli_static_module. Nếu bạn đang sử dụng kho chính thức của Ubuntu, bạn cần biên dịch từ mã nguồn hoặc sử dụng gói nginx-extra. - Quyền root hoặc sudo.
Bước 1: Cài đặt mô-đun Brotli (nếu chưa có)
# Cài đặt các phụ thuộc cần thiết
sudo apt-get update && sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
# Tải mã nguồn Nginx tương ứng với phiên bản đã cài đặt
NGINX_VER=$(nginx -v 2>&1 | grep -o '[0-9.]*')
wget https://nginx.org/download/nginx-$NGINX_VER.tar.gz
tar -xzf nginx-$NGINX_VER.tar.gz
cd nginx-$NGINX_VER
# Clone mã nguồn Brotli
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init && cd ..
# Cấu hình lại Nginx với hỗ trợ Brotli
sudo ./configure \
--with-http_ssl_module \
--add-module=./ngx_brotli
# Biên dịch lại và thay thế nhị phân (cẩn thận trên môi trường sản xuất!)
sudo make && sudo make install
# Xác minh việc tải mô-đun
nginx -V 2>&1 | grep -o brotli
Nếu bạn thích cách tiếp cận gói, các phiên bản nginx-full hoặc nginx-plus thường bao gồm Brotli có sẵn.
Bước 2: Kích hoạt gzip
Thêm đoạn mã sau vào tệp cấu hình chính nginx.conf (thường nằm dưới /etc/nginx/nginx.conf):
http {
# Cài đặt gzip cơ bản
gzip on;
gzip_comp_level 6; # 1-9, 6 là sự cân bằng tốt
gzip_min_length 256; # Không nén các phản hồi nhỏ
gzip_buffers 16 8k; # 16 bộ đệm mỗi bộ 8KB
gzip_http_version 1.1;
gzip_types \
text/plain \
text/css \
text/xml \
application/json \
application/javascript \
application/xml \
image/svg+xml;
gzip_vary on; # Kích hoạt Vary: Header Accept-Encoding
}
Kiểm tra nhanh
curl -I -H "Accept-Encoding: gzip" https://yourdomain.com/style.css
Bạn nên thấy Content-Encoding: gzip trong tiêu đề phản hồi.
Bước 3: Kích hoạt Brotli
Đặt đoạn mã này sau khối gzip (thứ tự không quan trọng, nhưng giữ cho gọn gàng):
http {
# Cài đặt Brotli – yêu cầu mô-đun đã được biên dịch trước đó
brotli on;
brotli_comp_level 4; # 0-11, 4 nhanh và vẫn hiệu quả
brotli_static on; # Phục vụ các tệp .br đã nén trước nếu chúng tồn tại
brotli_types \
text/plain \
text/css \
text/xml \
application/json \
application/javascript \
application/xml \
image/svg+xml;
}
Tại sao mức nén thấp hơn? Brotli tiêu tốn CPU nhiều ở mức cao. Mức 4-5 cung cấp một điểm ngọt cho hầu hết các trang web động.
Bước 4: Tinh chỉnh bộ đệm và thời gian chờ
Các tải trọng HTML lớn có thể tràn bộ đệm mặc định, khiến Nginx phải quay lại các luồng không nén. Điều chỉnh các giá trị này dựa trên kích thước phản hồi thông thường của bạn:
http {
client_body_buffer_size 128k;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
proxy_busy_buffers_size 256k;
}
Giám sát đầu ra nginx -T để kiểm tra bất kỳ cảnh báo buffer nào trong nhật ký lỗi.
Bước 5: Kiểm tra trên các trình duyệt và thiết bị
| Công cụ | Lệnh | Điều cần chú ý |
|---|---|---|
| curl | curl -H "Accept-Encoding: gzip, br" -I https://example.com |
Cả hai tiêu đề gzip và br đều xuất hiện. |
| Chrome DevTools | Tab Mạng → Cột Kích thước | Nên hiển thị kích thước đã nén. |
| WebPageTest | Chạy thử nghiệm với “Vô hiệu hóa nén” không được chọn | So sánh TTFB trước/sau. |
Nếu một client không gửi Accept-Encoding, Nginx sẽ tự động bỏ qua nén – không cần cấu hình thêm.
Bước 6: Tự động hóa xác minh với CI
Thêm một hành động GitHub đơn giản để lấy một trang và xác minh tiêu đề Content-Encoding:
name: Kiểm tra nén
on: [push, pull_request]
jobs:
test-compression:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cài đặt curl
run: sudo apt-get install -y curl
- name: Xác minh gzip
run: |
resp=$(curl -s -D - -o /dev/null -H "Accept-Encoding: gzip" https://staging.example.com)
echo "$resp" | grep -q "Content-Encoding: gzip"
- name: Xác minh brotli
run: |
resp=$(curl -s -D - -o /dev/null -H "Accept-Encoding: br" https://staging.example.com)
echo "$resp" | grep -q "Content-Encoding: br"
Việc thất bại trong pipeline CI buộc nhóm giữ cho nén hoạt động sau mỗi lần triển khai.
Bước 7: Theo dõi mức sử dụng CPU
Nén tiêu tốn CPU nhiều. Sử dụng htop hoặc top để theo dõi các quy trình nginx sau một đợt lưu lượng truy cập cao. Nếu bạn thấy mức CPU cao liên tục:
- Giảm
gzip_comp_levelhoặcbrotli_comp_level. - Chuyển tải các tài sản tĩnh đến CDN có hỗ trợ nén.
- Cân nhắc kích hoạt Brotli static và nén trước các tài sản trong bước xây dựng.
Thêm: Nén trước các tài sản trong quá trình xây dựng
Nếu bạn có một pipeline CI để gói các tài sản, hãy thêm một bước để tạo các tệp .gz và .br:
# Giả sử các tài sản nằm trong ./public
find public -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" \) -exec gzip -k -9 {} \;
find public -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" \) -exec brotli -q 11 -k {} \;
Nginx’s brotli_static on; và gzip_static on; sẽ phục vụ các tệp đã nén trước này trực tiếp, loại bỏ quá tải CPU thời gian chạy.
Kết luận
Việc tinh chỉnh đúng cách nén gzip và Brotli có thể cắt giảm tải trọng của bạn xuống một nửa, giảm chi phí băng thông và mang lại trải nghiệm nhanh chóng hơn cho người dùng toàn cầu. Bằng cách làm theo danh sách kiểm tra này – cài đặt mô-đun Brotli, cấu hình các kích thước bộ đệm hợp lý, xác minh với CI, và tùy chọn nén trước các tài sản – bạn sẽ có một thiết lập mạnh mẽ, sẵn sàng cho môi trường sản xuất.
Để tìm hiểu sâu hơn về hiệu suất và bảo mật máy chủ, hãy khám phá các nguồn tài nguyên như https://lacidaweb.com, nơi cung cấp các hướng dẫn thực tiễn dành cho các kỹ sư web hiện đại.