0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Tối Ưu Hiệu Năng Nginx: 6 Mẹo Giảm Độ Trễ & Tăng Tốc Độ

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

• 6 phút đọc

Giới thiệu

Trong vai trò là một DevOps lead, bạn có thể đã thấy Nginx đảm nhiệm vai trò quan trọng trong việc xử lý mọi thứ từ tài nguyên tĩnh đến API gateways. Mặc dù cấu hình mặc định có thể đủ cho khởi đầu nhanh chóng, nhưng lưu lượng truy cập sản xuất yêu cầu các thiết lập tinh chỉnh để giữ cho độ trễ thấp và tốc độ cao. Trong hướng dẫn thực tiễn này, chúng ta sẽ đi qua sáu điều chỉnh cụ thể mà bạn có thể áp dụng ngay hôm nay, giải thích lý do tại sao chúng quan trọng và cung cấp cho bạn các đoạn cấu hình chính xác mà bạn cần.


1. Định Kích Thước Quy Trình & Kết Nối Chính Xác

Nginx mặc định khởi động một quy trình làm việc cho mỗi lõi CPU. Tuy nhiên, bạn nên xác minh rằng chỉ thị worker_processes khớp với số lõi thực tế, đặc biệt trên các VM đám mây nơi số lượng vCPU quảng cáo có thể khác với số lõi vật lý.

nginx Copy
# /etc/nginx/nginx.conf
worker_processes auto;   # Để Nginx tự phát hiện số lõi
worker_rlimit_nofile 65535;  # Tăng giới hạn tệp mở cho tất cả các quy trình làm việc

events {
    worker_connections  8192;   # Kết nối đồng thời tối đa cho mỗi quy trình làm việc
    multi_accept on;            # Chấp nhận càng nhiều kết nối càng tốt cho mỗi vòng lặp sự kiện
}

Tại sao điều này quan trọng: Mỗi quy trình làm việc có thể xử lý worker_connections kết nối đồng thời. Nhân giá trị này với worker_processes để có số lượng kết nối tối đa lý thuyết. Thiết lập các giá trị này quá thấp sẽ làm giảm lưu lượng; quá cao có thể làm cạn kiệt tài nguyên hệ thống.


2. Tối Ưu Cài Đặt Keep-Alive

Kết nối liên tục giảm thiểu chi phí bắt tay TCP cho các yêu cầu tiếp theo. Tuy nhiên, một keepalive_timeout quá hào phóng có thể chiếm giữ các kết nối của quy trình làm việc.

nginx Copy
http {
    keepalive_timeout  15;      # Giây mà một kết nối giữ mở sau khi có yêu cầu
    keepalive_requests 100;    # Số yêu cầu tối đa cho mỗi kết nối keep-alive
    send_timeout 10s;          # Đóng các kết nối không hoạt động sau 10 giây im lặng
}

Mẹo: Giám sát kết nối activeidle bằng cách sử dụng nginx_status. Nếu các kết nối idle chiếm ưu thế, hãy giảm thời gian timeout.


3. Bật Nén Gzip hoặc Brotli Một Cách Khôn Ngoan

Nén các phản hồi giúp giảm băng thông và cải thiện tốc độ cảm nhận, nhưng chi phí CPU có thể trở thành một nút thắt cổ chai. Sử dụng nén có điều kiện:

nginx Copy
http {
    # Gzip – phương pháp dự phòng cho các trình duyệt cũ
    gzip on;
    gzip_types text/css application/javascript image/svg+xml;
    gzip_min_length 1024;   # Chỉ nén các phản hồi lớn hơn 1KB
    gzip_comp_level 4;      # Cân bằng giữa tốc độ và tỷ lệ nén

    # Brotli – hiện đại, tỷ lệ nén cao hơn
    brotli on;
    brotli_types text/css application/javascript image/svg+xml;
    brotli_comp_level 5;
    brotli_min_length 1024;
}

Thực tiễn tốt nhất: Bật cả hai, để Nginx tự thương lượng thuật toán tốt nhất dựa trên tiêu đề Accept-Encoding.


4. Tinh Chỉnh Kích Thước Bộ Đệm Cho Tiêu Đề & Tệp Lớn

Khi phục vụ các tệp lớn hoặc xử lý các API với tải trọng JSON lớn, kích thước bộ đệm mặc định có thể gây ra việc ghi đĩa không cần thiết.

nginx Copy
http {
    client_body_buffer_size 128k;
    client_max_body_size 50m;        # Điều chỉnh theo giới hạn tải lên của bạn
    large_client_header_buffers 4 16k;
    proxy_buffer_size 64k;
    proxy_buffers 8 64k;
    proxy_busy_buffers_size 128k;
}

Kết quả: Giảm khả năng gặp lỗi 502 Bad Gateway dưới tải và giữ việc sử dụng bộ nhớ có thể dự đoán.


5. Tăng Cường TLS Mà Không Hy Sinh Tốc Độ

Kết thúc TLS là một trách nhiệm phổ biến của Nginx. Các cipher hiện đại cung cấp cả bảo mật và hiệu suất.

nginx Copy
server {
    listen 443 ssl http2;
    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256";
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_stapling on;
    ssl_stapling_verify on;
}

Tại sao điều này quan trọng: TLS 1.3 giảm độ trễ bắt tay một cách đáng kể, và việc kích hoạt HTTP/2 (http2) cho phép trình duyệt đa dạng hóa các yêu cầu qua một kết nối duy nhất.


6. Tận Dụng Bộ Nhớ Đệm Tích Hợp Cho Tài Nguyên Tĩnh

Việc chuyển giao nội dung tĩnh cho bộ nhớ đệm nhanh của Nginx có thể giảm thiểu hàng mili giây cho mỗi yêu cầu.

nginx Copy
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:100m inactive=60m use_temp_path=off;
}

server {
    location /assets/ {
        alias /var/www/app/public/assets/;
        expires 30d;
        add_header Cache-Control "public, immutable";
        try_files $uri $uri/ =404;
    }

    location /api/ {
        proxy_pass http://backend:8080;
        proxy_cache STATIC;
        proxy_cache_valid 200 10m;
        proxy_cache_use_stale error timeout updating;
    }
}

Điểm chính:

  • expiresCache-Control cho trình duyệt biết giữ tài sản trong một tháng.
  • proxy_cache lưu trữ phản hồi API an toàn để lưu vào bộ nhớ đệm, giảm tải cho backend.

Giám Sát & Xác Nhận

Sau khi áp dụng các điều chỉnh này, hãy xác nhận tác động:

  • Chỉ số: Sử dụng nginx -s status hoặc một trình xuất Prometheus để theo dõi request_latency_seconds, active_connections, và worker_connections.
  • Kiểm tra tải: Các công cụ như hey hoặc wrk có thể mô phỏng lưu lượng và tiết lộ trần tốc độ mới.
  • Phân tích nhật ký: Kích hoạt $request_time trong định dạng nhật ký để phát hiện các giá trị ngoại lệ.
nginx Copy
log_format timed '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" $request_time';
access_log /var/log/nginx/access.log timed;

Kết luận

Tối ưu hiệu suất là một quá trình lặp đi lặp lại—bắt đầu với những điều dễ dàng (quy trình làm việc, keep-alive, nén), sau đó chuyển sang tăng cường TLS và bộ nhớ đệm. Bằng cách thường xuyên xem xét các chỉ số và điều chỉnh các tham số trên, bạn sẽ giữ cho độ trễ ở mức mili giây đơn lẻ ngay cả khi lưu lượng tăng vọt.

Nếu bạn đang tìm kiếm một đối tác đáng tin cậy để kiểm tra cấu hình Nginx của bạn hoặc giúp đỡ trong một quá trình di chuyển quy mô lớn, hãy xem xét truy cập https://lacidaweb.com để có một cuộc trò chuyện không áp lực.

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