Website của bạn đang chạy mượt mà bỗng dưng “sập nguồn” hoặc tải siêu chậm mỗi khi có đợt traffic tăng đột biến? CPU server nhảy vọt lên 100% trong khi dung lượng thực tế không quá lớn? Rất có thể, cấu hình Nginx mặc định của bạn đang bị quá tải.
Nginx nổi tiếng là nhẹ và nhanh, nhưng cấu hình mặc định (out-of-the-box) chỉ được thiết lập để chạy ở mức cơ bản nhất. Trong bài viết này, InterData sẽ hướng dẫn bạn cách can thiệp trực tiếp vào file cấu hình nginx.conf để vắt kiệt hiệu năng phần cứng, giúp server chịu tải tốt hơn gấp 3 – 4 lần.

1. Kiểm tra hiệu năng Nginx hiện tại trước khi bắt đầu tối ưu
Để tối ưu hóa Nginx, bước đầu tiên bắt buộc phải đo lường hiệu năng hiện tại bằng các công cụ stress test như ApacheBench (ab) hoặc WRK. Việc này giúp xác định giới hạn chịu tải của máy chủ (RPS – Requests Per Second) và độ trễ phản hồi (Latency) trước khi can thiệp sâu vào các file cấu hình hệ thống.
Đừng vội sửa code vội. Hãy cài đặt và chạy công cụ wrk bằng 1 dòng lệnh sau: wrk -t12 -c400 -d30s http://yourdomain.com/
Hãy chú ý đến 2 chỉ số trả về: Requests/sec (số yêu cầu xử lý mỗi giây) và Transfer/sec (băng thông tải).
Trải nghiệm thực tế mình từng gặp: Rất nhiều bạn khi tối ưu thường bỏ qua bước này, dẫn đến việc đổi cấu hình xong không biết hệ thống thực sự nhanh hơn hay đang chịu tải kém đi do xung đột tài nguyên. Đo lường trước và sau sẽ cho bạn câu trả lời rõ ràng nhất.
2. Cấu hình worker_processes và worker_connections: Đặt bao nhiêu là chuẩn?
Thông số worker_processes tối ưu nhất nên được đặt bằng chính số lượng nhân CPU (Core) thực tế của máy chủ hoặc dùng cấu hình auto. Trong khi đó, worker_connections nên được thiết lập từ 1024 đến 4096 tùy thuộc vào giới hạn file descriptor (ulimit -n) mà hệ điều hành Linux cho phép sử dụng.
Cần hiểu rõ cơ chế: Nếu đặt worker_processes quá nhiều so với số core CPU của server, bạn sẽ dính lỗi context switching (chuyển đổi ngữ cảnh của CPU) – CPU cứ luân chuyển qua lại giữa các tiến trình mà không xử lý được bao nhiêu việc, gây phản tác dụng.
Với worker_connections, công thức tính tổng số kết nối tối đa rất đơn giản: Max Clients = worker_processes * worker_connections. Tuy nhiên, trước khi đặt số lớn, hãy chạy lệnh ulimit -n trên server để kiểm tra giới hạn hệ điều hành. Đặt vượt quá giới hạn này, bạn sẽ ngay lập tức gặp lỗi “Too many open files”.
Dưới đây là đoạn code mẫu chuẩn cấu hình tài nguyên trong nginx.conf:
user nginx;
worker_processes auto; # Nginx tự động nhận diện số core CPU
pid /var/run/nginx.pid;
events {
worker_connections 2048; # Tăng lên từ mức 1024 mặc định
use epoll; # Sử dụng phương thức xử lý kết nối hiệu quả nhất trên Linux
multi_accept on; # Chấp nhận nhiều kết nối mới cùng lúc
}
3. Tối ưu bộ đệm Buffer và thời gian Timeout để triệt tiêu lỗi nghẽn cổ chai
Tối ưu hóa bộ đệm (Buffers) giúp Nginx ghi dữ liệu phản hồi trực tiếp vào RAM thay vì ghi xuống ổ đĩa cứng chậm chạp. Đồng thời, việc giảm thời gian Timeout (như keepalive_timeout xuống 15-30 giây) giúp đóng các kết nối không còn hoạt động, giải phóng dung lượng bộ nhớ cho người dùng mới.
Hãy cùng điều chỉnh các thông số sau:
Về Buffer:
client_body_buffer_size: Đặt mức10kđến16kcho các yêu cầu từ Client.client_max_body_size: Giới hạn dung lượng file upload (ví dụ:20Mhoặc50Mtùy nhu cầu). Nếu đặt quá nhỏ, người dùng sẽ gặp lỗi 413 Payload Too Large.client_header_buffer_size: Đặt1klà đủ cho hầu hết các trình duyệt.
Về Timeout:
keepalive_timeout: Nên đặt ở mức15hoặc30giây. Mặc định là 65 giây – quá dài và rất dễ bị treo RAM khi lượng truy cập lớn.send_timeout: Đặt10giây để ngắt các kết nối không nhận phản hồi từ phía client.
4. Kích hoạt tính năng nén Gzip giảm đến 70% dung lượng băng thông tải trang
Kích hoạt Gzip trên Nginx giúp nén các tệp văn bản tĩnh như HTML, CSS, JavaScript và JSON xuống dung lượng cực nhỏ, giúp tăng tốc độ tải trang trên thiết bị di động. Tuy nhiên, chỉ nên nén các tệp có dung lượng từ 1KB trở lên và mức độ nén tối ưu nhất là mức 5 hoặc 6 để cân bằng giữa hiệu quả nén và mức độ sử dụng CPU.
Một sai lầm khá phổ biến là chọn mức nén cao nhất (mức 9). Đừng làm vậy! CPU server sẽ phải vắt kiệt sức để nén thêm vài Kilobyte không đáng kể. Cân bằng luôn là chìa khóa.
Đây là đoạn cấu hình Gzip tối ưu mình thường áp dụng:
gzip on;
gzip_varying on;
gzip_proxied any;
gzip_comp_level 5; # Mức nén tối ưu, không tốn quá nhiều CPU
gzip_min_length 1024; # Chỉ nén các file lớn hơn 1KB
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\."; # Bỏ qua các trình duyệt IE quá cũ không hỗ trợ
5. Thiết lập Cache Static Files giúp giảm tải truy vấn sâu cho CPU
Cấu hình bộ nhớ đệm cho tài nguyên tĩnh (Static Files Cache) trên Nginx sử dụng tiêu đề Cache-Control cho phép trình duyệt của khách truy cập lưu trữ hình ảnh, CSS, JS và Font cục bộ trong thời gian dài (thường là 30 ngày đến 1 năm). Điều này giúp giảm tới 80% số lượng request trực tiếp gửi về máy chủ chủ quản.
Cấu hình mẫu cho định dạng ảnh, CSS, JS, Fonts:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt)$ {
expires 30d; # Lưu cache 30 ngày trên trình duyệt khách
access_log off; # Tắt ghi log truy cập file tĩnh để giảm tải I/O cho ổ cứng
add_header Cache-Control "public, no-transform";
}
Lưu ý thực tế: Khi bật cache trình duyệt cho CSS/JS, nếu bạn cập nhật code giao diện mới mà khách hàng không thấy thay đổi, hãy sử dụng kỹ thuật “Query String” (ví dụ: style.css?v=1.1) hoặc “Filename Versioning” để buộc trình duyệt tải bản mới nhất.
6. Bảo mật cơ bản và chặn Request ảo bằng Rate Limiting trên Nginx
Rate Limiting trên Nginx hoạt động dựa trên thuật toán Leaky Bucket, cho phép giới hạn số lượng request tối đa từ một địa chỉ IP trong một khoảng thời gian nhất định. Đây là lá chắn hiệu quả nhất để ngăn chặn các request spam, tool quét lỗ hổng bảo mật tự động tấn công trực tiếp vào ứng dụng web của bạn.
Bạn có thể khai báo vùng nhớ lưu trữ thông tin IP và giới hạn tần suất (ví dụ: tối đa 5 request mỗi giây cho mỗi IP) như sau:
# Đặt trong block http
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
# Đặt trong block server hoặc location cần bảo vệ (như trang login)
location /login/ {
limit_req zone=mylimit burst=10 nodelay;
}
7. Gợi ý hạ tầng tối ưu: Khi nào bạn cần nâng cấp Server?
Cần nhấn mạnh một thực tế phũ phàng: Việc tối ưu hóa phần mềm (Nginx) chỉ giúp bạn khai thác triệt để những gì phần cứng đang có. Nếu website của bạn có lượng truy cập tăng trưởng liên tục, hoặc đang chạy các tác vụ nặng cần xử lý CPU liên tục, cấu hình tối ưu Nginx đến mấy cũng sẽ chạm ngưỡng giới hạn vật lý của thiết bị cũ.
Lúc này, giải pháp bền vững nhất là di chuyển hệ thống sang một môi trường ảo hóa mạnh mẽ, có khả năng mở rộng tài nguyên linh hoạt và tốc độ ổ cứng cực nhanh.
Nếu đang tìm kiếm một hướng đi mới, bạn có thể tham khảo dịch vụ thuê VPS chất lượng cao tại InterData. Với hạ tầng sử dụng 100% ổ cứng NVMe siêu tốc, CPU server chuyên dụng thế hệ mới và băng thông rộng, việc triển khai và tối ưu Nginx của bạn trên VPS InterData sẽ đạt được hiệu suất vượt trội nhất mà không lo bị nghẽn cổ chai phần cứng.
8. Các câu hỏi thường gặp khi tối ưu hiệu năng Nginx
Q: Tại sao Nginx của tôi báo lỗi “502 Bad Gateway” sau khi thay đổi cấu hình?
A: Lỗi này xảy ra khi Nginx (đóng vai trò Reverse Proxy) không nhận được phản hồi từ dịch vụ phía sau (như PHP-FPM, Node.js). Nguyên nhân phổ biến sau khi tối ưu là bạn đặt thông số timeout quá ngắn hoặc dịch vụ PHP-FPM đang bị quá tải, không kịp xử lý request chuyển tiếp từ Nginx. Hãy kiểm tra file log /var/log/nginx/error.log để tìm nguyên nhân chính xác.
Q: Nên chọn Gzip hay Brotli để nén dữ liệu trên Nginx?
A: Brotli là thuật toán nén thế hệ mới do Google phát triển, cho hiệu năng nén tốt hơn Gzip từ 15 – 20% ở cùng một mức độ sử dụng CPU. Nếu server của bạn có cấu hình CPU tốt, hãy cài đặt module Brotli cho Nginx. Ngược lại, nếu chạy trên server tài nguyên thấp, Gzip vẫn là sự lựa chọn an toàn và tương thích 100% với mọi trình duyệt cũ.
Q: Làm thế nào để kiểm tra file cấu hình Nginx có bị lỗi cú pháp hay không trước khi reload?
A: Tuyệt đối không chạy lệnh systemctl restart nginx ngay sau khi sửa cấu hình vì nếu có lỗi cú pháp, server sẽ dừng hoạt động ngay lập tức. Hãy luôn sử dụng lệnh kiểm tra an toàn: nginx -t. Nếu hệ thống phản hồi syntax is ok và test is successful, bạn mới an tâm chạy lệnh reload cấu hình bằng lệnh nginx -s reload.
