Chào các bạn, Nginx ngày càng trở nên phổ biến như một webserver mạnh mẽ, nổi tiếng về hiệu suất cao và khả năng xử lý đồng thời lượng lớn kết nối. Tuy nhiên, để khai thác tối đa tiềm năng của Nginx và đảm bảo website của bạn luôn hoạt động nhanh chóng, việc tối ưu hóa cấu hình là vô cùng quan trọng. Hôm nay, mình sẽ chia sẻ với các bạn những bí quyết và kinh nghiệm thực tế để tối ưu Nginx, giúp webserver của bạn đạt được hiệu suất vượt trội.
Tại sao cần tối ưu Nginx?
Có lẽ bạn sẽ nghĩ rằng Nginx đã đủ nhanh rồi, vậy tại sao cần phải tối ưu hóa nữa? Dưới đây là một vài lý do chính:
- Cải thiện tốc độ tải trang: Thời gian tải trang là một yếu tố then chốt ảnh hưởng đến trải nghiệm người dùng và thứ hạng SEO. Nginx được tối ưu hóa sẽ giúp website của bạn tải nhanh hơn, giảm tỷ lệ thoát trang và tăng sự hài lòng của khách hàng.
- Tăng khả năng chịu tải: Khi website của bạn có lượng truy cập lớn, Nginx được tối ưu hóa sẽ giúp server xử lý nhiều yêu cầu đồng thời hơn mà không bị quá tải, đảm bảo website luôn hoạt động ổn định.
- Tiết kiệm tài nguyên server: Việc tối ưu hóa Nginx giúp giảm thiểu việc sử dụng tài nguyên hệ thống như CPU và bộ nhớ, cho phép bạn chạy website hiệu quả hơn trên cùng một cấu hình server hoặc tiết kiệm chi phí nâng cấp server.
- Nâng cao bảo mật: Một số kỹ thuật tối ưu hóa cũng có thể giúp tăng cường bảo mật cho webserver của bạn.
Mình đã từng chứng kiến một website sau khi được tối ưu hóa Nginx đã giảm đáng kể thời gian tải trang, từ đó cải thiện đáng kể tỷ lệ chuyển đổi và thứ hạng trên Google.

Các bước tối ưu hóa Nginx để tăng hiệu suất
Để tối ưu hóa Nginx, chúng ta cần điều chỉnh nhiều khía cạnh khác nhau trong cấu hình của nó. Dưới đây là những bước quan trọng bạn nên thực hiện:
1. Điều chỉnh Worker Processes và Worker Connections
Đây là hai thiết lập cơ bản nhưng cực kỳ quan trọng trong file cấu hình chính của Nginx (thường là nginx.conf).
Worker Processes: Thiết lập này xác định số lượng tiến trình worker mà Nginx sẽ sử dụng. Thông thường, bạn nên đặt giá trị này bằng với số lượng lõi CPU trên server của mình để tận dụng tối đa khả năng xử lý song song.
Ví dụ: Nếu server của bạn có 4 lõi CPU, bạn nên đặt:
Nginx
worker_processes 4;
Worker Connections: Thiết lập này xác định số lượng kết nối đồng thời mà mỗi tiến trình worker có thể xử lý. Giá trị này phụ thuộc vào tài nguyên server và loại hình website của bạn. Một con số phổ biến thường là vài ngàn, nhưng bạn cần thử nghiệm để tìm ra giá trị tối ưu.
Ví dụ:
Nginx
events {
worker_connections 2048;
}
- Lưu ý: Tổng số kết nối đồng thời mà server có thể xử lý sẽ là worker_processes nhân với worker_connections. Hãy đảm bảo rằng server của bạn có đủ tài nguyên để đáp ứng số lượng kết nối này.
Mình đã từng thấy một server hoạt động chậm chạp do thiết lập worker_connections quá thấp so với lượng truy cập thực tế. Sau khi tăng giá trị này, hiệu suất đã cải thiện đáng kể.
2. Bật nén Gzip hoặc Brotli
Nén dữ liệu trước khi gửi đến trình duyệt của người dùng là một trong những cách hiệu quả nhất để giảm kích thước trang web và cải thiện tốc độ tải. Nginx hỗ trợ cả Gzip (phổ biến) và Brotli (hiệu quả hơn nhưng có thể cần cài đặt thêm module).
Sử dụng Gzip:
Thêm các dòng sau vào block http trong file cấu hình:
Nginx
http {
# … các cấu hình khác …
gzip on;
gzip_disable “msie6”;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-woff application/svg+xml application/font-sfnt application/ld+json;
}
- gzip on: Bật nén Gzip.
- gzip_disable “msie6”: Tắt nén cho trình duyệt Internet Explorer 6 cũ.
- gzip_vary on: Thêm header Vary: Accept-Encoding để thông báo cho các proxy server rằng các phiên bản nén khác nhau có thể tồn tại.
- gzip_proxied any: Bật nén cho các yêu cầu thông qua proxy.
- gzip_comp_level 6: Mức độ nén (từ 1 đến 9, 9 là cao nhất nhưng tốn nhiều CPU hơn). 6 là một mức cân bằng tốt.
- gzip_buffers 16 8k: Số lượng và kích thước bộ đệm để nén dữ liệu.
- gzip_http_version 1.1: Chỉ nén cho các yêu cầu HTTP 1.1 trở lên.
- gzip_types: Các loại MIME mà bạn muốn nén.
Sử dụng Brotli (cần cài đặt module ngx_brotli):
Nếu bạn đã cài đặt module ngx_brotli, bạn có thể sử dụng Brotli thay vì hoặc kết hợp với Gzip.
Nginx
http {
# … các cấu hình khác …
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-woff application/svg+xml application/font-sfnt application/ld+json;
}
Mình đã thử nghiệm Brotli trên một số website và thấy rằng nó giúp giảm kích thước file tốt hơn Gzip, dẫn đến thời gian tải trang nhanh hơn.
3. Caching
Caching là một kỹ thuật quan trọng để giảm tải cho server và tăng tốc độ phục vụ nội dung. Nginx có nhiều cơ chế caching khác nhau mà bạn có thể tận dụng.
Browser Caching:
Hướng dẫn trình duyệt của người dùng lưu trữ các tài nguyên tĩnh (hình ảnh, CSS, JavaScript) trong một khoảng thời gian nhất định để không phải tải lại chúng ở các lần truy cập sau. Thêm các header sau vào block server hoặc location cho các tài nguyên tĩnh:

Nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control “public, max-age=2592000”;
}
- expires 30d: Chỉ định thời gian trình duyệt sẽ lưu trữ tài nguyên là 30 ngày.
- add_header Cache-Control “public, max-age=2592000”: Một cách khác để chỉ định thời gian cache (2592000 giây = 30 ngày).
Server-side Caching (Proxy Cache):
Nginx có thể hoạt động như một reverse proxy và cache các phản hồi từ backend server (ví dụ: web application server như Apache, PHP-FPM). Điều này đặc biệt hữu ích cho các website động. Thêm các dòng sau vào block http:
Nginx
http {
# … các cấu hình khác …
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
proxy_temp_path /tmp/nginx_temp;
# …
}
Sau đó, trong block server hoặc location mà bạn muốn cache:
Nginx
location / {
proxy_pass http://backend_server; # Địa chỉ backend server của bạn
proxy_cache my_cache;
proxy_cache_valid 200 302 60m; # Cache các phản hồi có mã 200 và 302 trong 60 phút
proxy_cache_valid 404 1m; # Cache các phản hồi có mã 404 trong 1 phút
proxy_cache_key “$scheme$request_method$host$request_uri”;
add_header X-Proxy-Cache $upstream_cache_status; # Thêm header để kiểm tra trạng thái cache
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_xforwarded_for;
}
Lưu ý: Đường dẫn /tmp/nginx_cache và /tmp/nginx_temp chỉ là ví dụ. Bạn nên chọn các đường dẫn phù hợp trên server của mình. Hãy đảm bảo rằng Nginx process có quyền ghi vào các thư mục này.
Mình đã sử dụng proxy caching để giảm tải đáng kể cho server ứng dụng của một website WordPress có lượng truy cập lớn.
4. Tối ưu hóa Keep-Alive Connections
Keep-alive cho phép trình duyệt thiết lập một kết nối TCP duy nhất với server để gửi và nhận nhiều yêu cầu HTTP, thay vì phải thiết lập một kết nối mới cho mỗi yêu cầu. Điều này giúp giảm độ trễ và cải thiện hiệu suất. Thiết lập keepalive_timeout trong block http:
Nginx
http {
# … các cấu hình khác …
keepalive_timeout 65;
}
Giá trị 65 giây là một giá trị phổ biến, nhưng bạn có thể điều chỉnh nó tùy theo nhu cầu.
5. Sử dụng Module Static
Đối với việc phục vụ nội dung tĩnh, hãy đảm bảo bạn đang sử dụng module ngx_http_static_module một cách hiệu quả. Nginx được tối ưu hóa rất tốt cho việc này. Trong block location cho các tài nguyên tĩnh:
Nginx
location ~ ^/(images|css|js|fonts)/ {
root /path/to/your/website;
}
Hoặc bạn có thể sử dụng directive static (có sẵn từ Nginx 1.13.9):
Nginx
location /static/ {
root /path/to/your/website;
static;
}
6. Tắt Logging Không Cần Thiết
Logging rất hữu ích cho việc gỡ lỗi, nhưng nếu không cần thiết, việc ghi log có thể tiêu tốn tài nguyên server. Bạn có thể tắt logging hoàn toàn hoặc chỉ ghi log ở mức độ quan trọng.
Để tắt access log cho một location cụ thể:
Nginx
location /static/ {
access_log off;
# … các cấu hình khác …
}
Để điều chỉnh format hoặc mức độ log, bạn có thể cấu hình directive log_format và access_log trong block http.
7. Cân nhắc sử dụng HTTP/2
HTTP/2 là một phiên bản mới của giao thức HTTP mang lại nhiều cải tiến về hiệu suất so với HTTP/1.1, bao gồm multiplexing (gửi nhiều yêu cầu qua một kết nối duy nhất), header compression và server push. Để bật HTTP/2, bạn cần có chứng chỉ SSL và thêm tham số http2 vào directive listen trong block server:
Nginx
server {
listen 443 ssl http2;
# … các cấu hình SSL và website khác …
}
Việc chuyển sang HTTP/2 có thể mang lại sự cải thiện đáng kể về tốc độ tải trang, đặc biệt đối với các website có nhiều tài nguyên.
8. Tinh chỉnh Socket Parameters
Các tham số socket có thể ảnh hưởng đến hiệu suất mạng của Nginx. Bạn có thể thử điều chỉnh các thiết lập sau trong block http:
Nginx
http {
# … các cấu hình khác …
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
- sendfile on: Bật tính năng sendfile, cho phép Nginx gửi dữ liệu trực tiếp từ disk đến socket mà không cần copy vào user space, giúp tăng hiệu suất phục vụ file tĩnh.
- tcp_nopush on: Chỉ gửi gói tin khi chúng đầy hoặc khi có yêu cầu rõ ràng, giúp giảm số lượng gói tin nhỏ được gửi đi.
- tcp_nodelay on: Tắt thuật toán Nagle, giảm độ trễ cho các kết nối thời gian thực. Hãy cẩn thận khi sử dụng tùy chọn này, vì nó có thể làm tăng băng thông sử dụng nếu không được cấu hình đúng cách.
Lưu ý quan trọng khi tối ưu Nginx

- Sao lưu cấu hình trước khi thay đổi: Luôn tạo một bản sao lưu của file cấu hình Nginx trước khi bạn thực hiện bất kỳ thay đổi nào. Điều này giúp bạn dễ dàng quay lại cấu hình cũ nếu có vấn đề xảy ra.
- Kiểm tra cấu hình sau khi thay đổi: Sau khi thực hiện các thay đổi, hãy sử dụng lệnh nginx -t để kiểm tra xem cấu hình của bạn có hợp lệ hay không. Nếu có lỗi, Nginx sẽ thông báo cho bạn biết.
- Khởi động lại Nginx sau khi thay đổi: Để các thay đổi có hiệu lực, bạn cần khởi động lại hoặc tải lại cấu hình của Nginx bằng lệnh sudo systemctl restart nginx hoặc sudo nginx -s reload.
- Theo dõi hiệu suất: Sau khi tối ưu hóa, hãy theo dõi hiệu suất của website và server để đảm bảo rằng các thay đổi bạn đã thực hiện thực sự mang lại hiệu quả. Bạn có thể sử dụng các công cụ như Google PageSpeed Insights, GTmetrix hoặc các công cụ giám sát server.
- Thử nghiệm và điều chỉnh: Các thiết lập tối ưu có thể khác nhau tùy thuộc vào cấu hình server, loại hình website và lượng truy cập. Hãy thử nghiệm các cấu hình khác nhau và điều chỉnh chúng cho phù hợp với nhu cầu cụ thể của bạn.
Mình đã từng mất khá nhiều thời gian để tìm ra cấu hình tối ưu nhất cho một website cụ thể bằng cách thử nghiệm và theo dõi hiệu suất liên tục.
Kết luận
Tối ưu hóa Nginx là một quá trình liên tục và đòi hỏi sự kiên nhẫn và thử nghiệm. Bằng cách thực hiện các bước được đề cập trong bài viết này, bạn có thể cải thiện đáng kể hiệu suất webserver của mình, mang lại trải nghiệm tốt hơn cho người dùng và nâng cao thứ hạng SEO cho website. Chúc các bạn thành công!