Tối ưu nginx nâng cao là chìa khóa vàng giúp hệ thống của bạn vận hành trơn tru ngay cả trong những đợt cao điểm traffic đột biến. Bài viết này sẽ trang bị cho bạn những kỹ thuật chuyên sâu, từ điều chỉnh kernel đến tối ưu cache và logging, giúp giải quyết triệt để các điểm nghẽn hiệu suất.
1. Nền tảng vững chắc: Tối ưu Worker Process và Kết nối
Mọi chiến lược tối ưu nginx nâng cao đều bắt đầu từ việc cấu hình đúng cách các worker process và giới hạn kết nối. Đây là lớp nền tảng quyết định khả năng xử lý đồng thời của server.
Cách để tính toán số lượng worker_processes và worker_connections tối ưu?
Trả lời ngắn: Đặt worker_processes auto; và worker_connections bằng khoảng số lượng file descriptor khả dụng / worker_processes. Một con số khởi điểm tốt cho hệ thống hiện đại là worker_connections 10240; và worker_rlimit_nofile 20000;.
Giải thích chi tiết:
Đầu tiên, hãy để Nginx tự động phát hiện số nhân CPU bằng worker_processes auto;. Tiếp theo, tối ưu hóa I/O bằng cách sử dụng mô hình epoll (cho Linux) – đây là lựa chọn hiệu quả nhất cho các hệ thống có lượng kết nối lớn.
Yếu tố then chốt tiếp theo là giới hạn file descriptor. Mỗi kết nối tiêu tốn một file descriptor. Do đó, bạn cần tăng giới hạn này cả ở cấp độ hệ điều hành (ulimit) lẫn trong Nginx. Công thức gần đúng cho số kết nối tối đa là worker_processes * worker_connections.
Ví dụ cấu hình cơ bản trong /etc/nginx/nginx.conf:
nginx
user nginx;
worker_processes auto;
worker_rlimit_nofile 20000;
events {
use epoll;
worker_connections 10240;
multi_accept on;
}
Đừng quên kiểm tra và tăng ulimit -n trên hệ thống để tương thích với worker_rlimit_nofile.
2. Tối ưu Buffer: Giải quyết triệt để lỗi upstream sent too big header
Khi Nginx hoạt động như một reverse proxy, buffer đóng vai trò là bộ đệm trung gian giữa client và upstream. Cấu hình buffer không hợp lý là nguyên nhân hàng đầu gây ra lỗi 502 Bad Gateway.

Cách khắc phục lỗi “upstream sent too big header” do buffer quá nhỏ?
Trả lời ngắn: Tăng proxy_buffer_size lên 16k hoặc 32k và điều chỉnh proxy_buffers (ví dụ: proxy_buffers 8 16k;) để đáp ứng kích thước header hoặc response body từ upstream.
Giải thích chi tiết:
proxy_buffer_size đặc biệt quan trọng vì nó lưu trữ phần đầu của response (header). Nếu header vượt quá kích thước này, Nginx sẽ báo lỗi. Mặc định thường là 4k hoặc 8k, quá nhỏ cho các ứng dụng hiện đại.
proxy_buffers xác định số lượng và kích thước của các buffer dùng để đọc response từ upstream. Bạn có thể tham khảo thêm tài liệu chính thức tại Nginx Proxy Module để nắm rõ các thông số.
Cấu hình đề xuất cho một hệ thống có lượng request vừa phải:
nginx
http {
proxy_buffer_size 16k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
}
3. Tận dụng sức mạnh của Cache: Giảm tải cho Backend
Bật cache là một trong những cách tối ưu nginx nâng cao hiệu quả nhất để giảm tải cho server upstream và cải thiện thời gian phản hồi cho client.
Các bước cấu hình cache cho Nginx reverse proxy
Trả lời ngắn:
- Định nghĩa vùng cache với proxy_cache_path trong khối http.
- Kích hoạt cache trong location cần thiết bằng proxy_cache.
- Thiết lập thời gian cache cho từng mã trạng thái với proxy_cache_valid.
Giải thích chi tiết:

proxy_cache_path chỉ định thư mục lưu cache, kích thước vùng nhớ (keys_zone) và dung lượng tối đa (max_size).
Ví dụ cấu hình cache:
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m max_size=10g inactive=60m;
proxy_cache_key “$scheme$request_method$host$request_uri”;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
}
}
Mẹo: Sử dụng proxy_cache_lock để tránh tình trạng nhiều request cùng lúc gửi đến backend khi cache chưa sẵn sàng (hiệu ứng stampede).
4. Tối ưu kết nối Keepalive: Giảm thiểu TCP Handshake
Mỗi kết nối TCP mới đều tốn kém chi phí. Việc tái sử dụng kết nối đến upstream (keepalive) giúp giảm đáng kể độ trễ và tải CPU.
Cách cấu hình keepalive cho upstream trong Nginx?
Trả lời ngắn: Thêm tham số keepalive vào khối upstream và thiết lập proxy_http_version 1.1; cùng header Connection “” trong location để Nginx tái sử dụng kết nối đến backend.
Giải thích chi tiết:
keepalive trong khối upstream chỉ định số lượng kết nối nhàn rỗi tối đa mà mỗi worker process giữ để tái sử dụng. Một nguyên tắc là con số này nên ít nhất bằng số lượng server trong upstream group.
Ví dụ:
nginx
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
keepalive 32;
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection “”;
proxy_pass http://backend;
}
}

5. Tối ưu Logging: Giảm tải I/O cho Disk
Ghi log là một hoạt động tốn kém I/O. Trong các hệ thống có lượng request lớn, việc ghi log không hợp lý có thể trở thành nút thắt cổ chai.
Làm sao để giảm tác động của access_log đến hiệu suất Nginx?
Trả lời ngắn: Sử dụng tham số buffer= trong directive access_log để ghi log vào bộ nhớ đệm trước, thay vì ghi trực tiếp xuống đĩa cho mỗi request.
Giải thích chi tiết:
Khi bật buffer, log sẽ được tích lũy trong bộ nhớ và chỉ ghi xuống đĩa khi buffer đầy hoặc sau một khoảng thời gian nhất định (dùng flush=).
Cấu hình đề xuất:
nginx
http {
access_log /var/log/nginx/access.log main buffer=128k flush=5s;
error_log /var/log/nginx/error.log warn;
}
Ngoài ra, hãy cân nhắc giảm mức độ chi tiết của error_log (ví dụ từ info xuống warn) để giảm lượng log không cần thiết.
6. Tối ưu Bảo mật: Vũ khí không thể thiếu
Một hệ thống an toàn mới là một hệ thống thực sự tối ưu. Các cấu hình bảo mật không chỉ bảo vệ server mà còn có thể cải thiện hiệu suất thông qua việc tối ưu truyền tải.
Các header bảo mật nào sysadmin nhất định phải thêm vào Nginx?
Trả lời ngắn:

- X-Frame-Options: “SAMEORIGIN” hoặc “DENY” để chống clickjacking.
- X-Content-Type-Options: “nosniff” để ngăn MIME sniffing.
- Strict-Transport-Security (HSTS): “max-age=31536000; includeSubDomains; preload” để buộc HTTPS.
- Content-Security-Policy (CSP): “default-src ‘self'” để giới hạn nguồn tài nguyên.
Giải thích chi tiết:
server_tokens off; giúp tắt hiển thị phiên bản Nginx, ngăn kẻ tấn công khai thác lỗ hổng theo phiên bản cụ thể. Bạn có thể tham khảo thêm hướng dẫn bảo mật từ DigitalOcean Nginx Guide.
7. Tinh chỉnh hệ thống (Kernel Tuning) cho cao thủ
Đây là cấp độ tối ưu nginx nâng cao nhất, đòi hỏi sự hiểu biết sâu sắc về hệ điều hành. Các tham số này ảnh hưởng đến toàn bộ stack mạng của server.
Điều chỉnh thông số sysctl nào giúp Nginx xử lý hàng nghìn kết nối đồng thời?
Trả lời ngắn: Tăng net.core.somaxconn và net.ipv4.tcp_max_syn_backlog, đồng thời kích hoạt tcp_tw_reuse và điều chỉnh tcp_rmem/tcp_wmem.
Giải thích chi tiết:
Việc điều chỉnh này giúp hệ thống chống tràn hàng đợi kết nối và tận dụng tối đa bộ nhớ cho các kết nối TCP.
Ví dụ file cấu hình sysctl (/etc/sysctl.d/99-nginx.conf):
conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.netdev_max_backlog = 5000
Áp dụng thay đổi bằng lệnh sysctl -p.
Tóm lại, tối ưu nginx nâng cao là một hành trình dài giúp hệ thống của bạn luôn mạnh mẽ và ổn định. Hãy bắt đầu áp dụng ngay hôm nay để thấy sự khác biệt rõ rệt!
