Cách tối ưu hiệu suất Nginx

Tác giả Network Engineer, T.M.Một 12, 2021, 02:51:19 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách tối ưu hiệu suất Nginx


Nginx là một máy chủ web nhẹ và hiệu suất cao mã nguồn mở miễn phí được sử dụng làm trình cân bằng tải, proxy ngược, bộ Cache HTTP và proxy email. Mặc dù Nginx còn khá mới so với các máy chủ web khác, nhưng tính phổ biến của nó đang tăng lên do hiệu suất cao. Với cấu hình Nginx mặc định của bạn, bạn có thể nhận được hiệu suất nhanh nhưng mình có thể tăng hiệu suất Nginx ở mức tốt nhất bằng cách thay đổi một số cấu hình.

Trong bài viết này, bạn sẽ biết 8 cách tốt nhất khác nhau để thúc đẩy Nginx để có hiệu suất tốt hơn. Để minh họa ví dụ trong bài viết này, mình đã cài đặt Nginx trên hệ thống Ubuntu 20.04 LTS.

1. Sửa đổi Worker Processes

Tất cả các yêu cầu máy chủ web trong Nginx đều được xử lý bởi một Worker Processes. Trong Nginx, các Worker Processes được kiến trúc như nhiều tiến trình của worker để xử lý yêu cầu và một tiến trình chính chịu trách nhiệm quản lý tất cả các tiến trình của worker cũng như phân tích cấu hình. Trong cấu hình mặc định của Nginx, tham số Worker Processes được đặt thành tự động tạo Worker Processes theo lõi CPU có sẵn. Theo khuyến nghị của các tài liệu chính thức của Nginx, đó là cách tốt nhất để giữ Worker Processes theo lõi CPU có sẵn vì vậy thông số tự động được khuyến nghị. Nếu bạn muốn biết bộ vi xử lý của mình có bao nhiêu lõi thì chỉ cần chạy lệnh sau.

Mã nguồn [Chọn]
$ grep processor /proc/cpuinfo | wc -l

Bạn có thể thay đổi giá trị mặc định của qWorker Processes từ tập tin cấu hình Nginx có tại /etc/nginx/nginx.conf. Nếu máy chủ của bạn đang có lưu lượng truy cập cao hơn và bạn cần thêm nhiều Worker Processes thì tốt hơn nên nâng cấp máy chủ lên nhiều bộ xử lý lõi hơn.


2. Tăng cường Worker Connections Limit

Worker Connections là tổng số kết nối đồng thời mà mỗi Worker Processes có sẵn có thể quản lý. Theo mặc định, Worker Processes có thể quản lý 512 kết nối cùng một lúc. Trước khi sửa đổi giá trị Worker Connections, bạn phải kiểm tra hệ thống kết nối tối đa để cho phép sử dụng lệnh sau để cập nhật cấu hình kết nối theo nó.

Mã nguồn [Chọn]
$ ulimit -n

Để nâng cao tiềm năng của Nginx, hãy đặt giá trị Worker Connections thành số kết nối tối đa mà hệ thống cho phép trong tập tin nginx.conf.


3. Thực hiện nén nội dung (Content Compression)

Để nén nội dung web, Nginx sử dụng gzip để tăng thời gian phân phối nội dung và giảm việc sử dụng băng thông mạng. Trong cấu hình, bạn có thể tìm thấy cấu hình gzip ở trạng thái bị vô hiệu hóa nhưng bạn có thể bỏ ghi chú để kích hoạt tính năng này và sửa đổi gzip theo nhu cầu của mình.

Vì quá trình nén gzip sử dụng tài nguyên hệ thống nếu bạn có tài nguyên hạn chế, hãy sửa đổi cấu hình theo nó như chỉ nén một loại tập tin cụ thể, mức nén, v.v.


4. Lưu vào bộ Cache nội dung tĩnh

Trong sự phát triển web hiện đại này, hầu hết nội dung được phân phối tĩnh cho trình duyệt hoặc ứng dụng khách, vì vậy bộ nhớ Cache các tập tin tĩnh sẽ tải nội dung nhanh hơn. Nó cũng sẽ giảm yêu cầu kết nối đến Nginx khi nội dung được tải từ bộ nhớ cache.

Để bắt đầu quá trình lưu vào bộ nhớ Cache, hãy thêm tùy chọn sau vào tập tin cấu hình máy chủ ảo Nginx của bạn.

Mã nguồn [Chọn]
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;}
Tùy chọn trên lưu vào bộ nhớ cache tập tin tài nguyên trong 30 ngày. Bạn có thể đặt ngày hết hạn bộ nhớ cache theo nhu cầu của mình.

5. Buffering

Buffering có thể làm cho giao tiếp giữa máy khách và máy chủ hiệu quả hơn vì nó giữ một phần phản hồi cho đến khi Buffering đầy. Nếu phản hồi quá cao so với kích thước Buffering thực thì Nginx sẽ ghi phản hồi vào đĩa, điều này có thể dẫn đến sự cố về hiệu suất. Bạn có thể cập nhật lệnh sau để điều chỉnh kích thước Buffering theo yêu cầu của bạn.

  • Client_body_buffer_size: Nó xác định kích thước bộ Cache thực tế được sử dụng để chứa dữ liệu phản hồi của máy khách.
  • Client_header_buffer_size: Nó quản lý kích thước của tiêu đề máy khách. Thông thường, đặt giá trị thành 1k là đủ tốt.
  • Client_max_body_size: Nó giới hạn phản hồi nội dung tối đa được phép cho máy khách. Nếu kích thước nội dung vượt quá giá trị của nó, Nginx sẽ thông báo lỗi "Request Entity Too Large".

Để điều chỉnh kích thước Buffering, hãy thêm tùy chọn sau trong phần http.

Mã nguồn [Chọn]
http {
...
client_body_buffer_size 80k;
client_max_body_size 9m;
client_header_buffer_size 1k;
...
}

6. Access Log

Ghi nhật ký là một trong những vai trò quan trọng trong việc gỡ lỗi vấn đề và kiểm tra. Vì ghi nhật ký lưu trữ mọi dữ liệu yêu cầu, điều này ảnh hưởng đến cả chu kỳ I / O và CPU dẫn đến các vấn đề về hiệu suất. Bạn có thể giảm loại tác động này bằng cách bật Buffering vào nhật ký. Khi kích thước bộ Buffering đạt đến giới hạn, Nginx sẽ ghi nội dung Buffering vào nhật ký. Bạn có thể kích hoạt Buffering bằng cách thêm các tham số Buffering với giá trị kích thước vào chỉ thị nhật ký truy cập.

Mã nguồn [Chọn]
access_log /var/log/nginx/access.log main buffer=16k;
Hoặc bạn có thể vô hiệu hóa nhật ký truy cập (nếu không cần thiết) theo cách sau.

Mã nguồn [Chọn]
access_log off;
7. Giới hạn giá trị thời gian chờ

Giới hạn giá trị thời gian chờ sẽ nâng cao hiệu suất của Nginx. Nginx sẽ đợi yêu cầu nội dung và tiêu đề của máy khách trong một khoảng thời gian nhất định. Nếu họ không nhận được dữ liệu phản hồi kịp thời, Nginx sẽ kích hoạt thời gian chờ cho ứng dụng khách tương ứng.

Giá trị thời gian chờ có thể được quản lý bằng lệnh sau. Để đặt khoảng thời gian chờ, hãy sao chép và dán lệnh đưa ra bên dưới trong phần http.

Mã nguồn [Chọn]
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 13;
send_timeout 10;

  • Client_body_timeout và client_header_timeout là khoảng thời gian Nginx đọc tiêu đề và nội dung từ yêu cầu của máy khách. Nếu không hoàn thành trong thời gian yêu cầu sẽ bị chấm dứt với lỗi hết thời gian.


  • Keepalive_timeout là khoảng thời gian sau khi Nginx đóng kết nối máy khách, giữ cho kết nối tồn tại luôn mở.

  • Send_timeout là khoảng thời gian máy khách phải nhận được phản hồi do Nginx gửi.

8. Open File Cache

Trong Linux hầu hết mọi thứ đều là tập tin, khi open_file_cache được sử dụng, bộ mô tả tập tin và tất cả các tập tin được truy cập thường xuyên sẽ được lưu vào bộ nhớ Cache vào máy chủ. Đặc biệt khi cung cấp các tập tin Html tĩnh bằng cách sử dụng bộ Cache tập tin mở sẽ nâng cao hiệu suất của Nginx vì nó mở và lưu trữ bộ Cache trong bộ nhớ trong một khoảng thời gian nhất định. Đặt tùy chọn sau của open_file_cache trong phần http để bắt đầu lưu vào bộ nhớ Cache.

Mã nguồn [Chọn]
http {
...
open_file_cache max=1024 inactive=10s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

Đây là 8 cách để tối ưu và tăng hiệu suất Nginx bằng cách sửa đổi đơn giản tập tin cấu hình Nginx. Mình hy vọng sau khi đọc bài viết này sẽ giúp bạn có thể bắt đầu tăng được hiệu suất Nginx.