Worker là đơn vị handle sự kiện của nginx, khi triển khai thêm nhiều worker hợp lý sẽ giúp tăng hiệu năng ứng dụng lên rất nhiều.
Để kiểm tra nginx có bao nhiêu worker, hãy sử dụng câu lệnh
sudo systemctl status nginx
Kết quả
# ● nginx.service - A high performance web server and a reverse proxy server
# Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
# Active: active (running) since Sun 2021-04-25 08:33:11 UTC; 5h 45min ago
# Docs: man:nginx(8)
# Main PID: 3904 (nginx)
# Tasks: 2 (limit: 1136)
# Memory: 3.2M
# CGroup: /system.slice/nginx.service
# ├─ 3904 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
# └─16443 nginx: worker process
Tại đây, ta có thể thấy được 1 worker đang hoạt động trong nginx.
Số lượng worker có thể bị thay đổi với config như sau
worker_processes 2;
events {
}
http {
server {
listen 80;
server_name nginx-handbook.test;
return 200 "worker processes and worker connections configuration!\n";
}
}
Tại đây, ta đang sử dụng directive worker_process, với thuộc tính này, ta có thể quyết định số lượng worker được vận hành trong nginx.
Kiểm tra lại số lượng worker bằng câu lệnh sau:
sudo systemctl status nginx
Kết quả
# ● nginx.service - A high performance web server and a reverse proxy server
# Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
# Active: active (running) since Sun 2021-04-25 08:33:11 UTC; 5h 54min ago
# Docs: man:nginx(8)
# Process: 22610 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
# Main PID: 3904 (nginx)
# Tasks: 3 (limit: 1136)
# Memory: 3.7M
# CGroup: /system.slice/nginx.service
# ├─ 3904 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
# ├─22611 nginx: worker process
# └─22612 nginx: worker process
Giờ đây ta có thể thấy đã có 2 worker hoạt động trên hệ thống nginx.
Việc thiết lập rất dễ dàng, vậy một server nginx cần thiết lập bao nhiêu worker sẽ phù hợp.
Nếu ta thiết lập 1 worker, đương nhiên 1 worker này sẽ chiếm toàn bộ 100% tiến trình hệ thống. Và nếu thiết lập 2 woker, mỗi worker sẽ chiếm 50% tiến trình hệ thống. Vậy nên việc tăng số lượng worker cao không có nghĩa sẽ tăng hiệu năng server.
Cách đơn giản nhất để biết được số lượng worker phù hợp nên căn cứ vào số lượng core của server. Ví dụ, nếu server là dual core thì ta sẽ thiết lập 2 worker là hợp lý, và nếu server là quad core thì thiết lập 4 worker là phù hợp.
Để xem số lượng core trên server linux, hãy dùng câu lệnh sau
nproc
Kết quả
# 1
Tại đây ta thấy ta có 1 core tương ứng với việc ta sẽ có 1 worker. Vấn đề mới sẽ diễn ra nếu ta nâng cấp server lên 2 core, thì ta phải sửa lại config và nó sẽ rủi ro vì chúng ta có thể quên thiết lập.
Để khác phục lại trường hợp trên, hãy thực hiện config như sau
worker_processes auto;
events {
}
http {
server {
listen 80;
server_name nglearns.test;
return 200 "worker processes and worker connections configuration!\n";
}
}
Bằng cách thiết lập worker_processes
là auto
, ta sẽ uy quyền cho nginx thiết lập số lượng worker phù hợp cho ứng dụng.
Tiếp theo, ta sẽ cần tối ưu cho một worker sẽ xử lý bao nhiêu kết nối. Để biết được điều này, ta sẽ sử dụng câu lệnh sau
ulimit -n
Kết quả
# 1024
Và bây giờ ta có thể config dễ dàng cho worker, hãy tham khảo ví dụ sau
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name nglearns.test;
return 200 "worker processes and worker connections configuration!\n";
}
}
Bằng cách sử dụng context events
và directive worker_connections
, ta có thể quyết định được số lượng connection chính xác cho worker.