0
0
Lập trình
Admin Team
Admin Teamtechmely

Tối Ưu Hiệu Suất Nginx: Làm Chủ Gzip và Brotli

Đăng vào 1 tháng trước

• 7 phút đọc

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_modulengx_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ó)

Copy
# 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):

Copy
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

Copy
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):

Copy
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:

Copy
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 đề gzipbr đề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:

Copy
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_level hoặc brotli_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.br:

Copy
# 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;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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào