nginx worker_processes
worker_processes 是什么
worker_processes
是 Nginx 配置中的一个设置,它用来指定 Nginx 服务器将启动多少个工作进程来处理请求。你可以把工作进程理解为是一些工人,每个工人都能独立地处理进入服务器的网络请求,比如加载网页、图片等。
在默认情况下,worker_processes
被设置为 1,意味着只有一个工人在处理所有的请求。如果你的服务器有更多的 CPU 核心,并且你希望能更快地处理更多的请求,那么增加这个数字可能会有帮助。例如,如果你的服务器有 4 个 CPU 核心,你可以设置 worker_processes
为 4,这样每个核心都有一个对应的工作进程来处理任务。
还有一个选项是 auto
,这会让 Nginx 自动检测 CPU 核心的数量,并为每个核心分配一个工作进程。这通常是一个不错的选择,因为它可以让 Nginx 根据服务器的实际硬件配置来优化处理能力。
总的来说,设置更多的工作进程可以帮助你的服务器更有效地处理更多的并发请求,特别是在高流量的情况下。但是,也要注意不要设置过多的工作进程,因为这可能会导致资源竞争,反而降低效率。
worker_processes 官方文档上介绍
https://nginx.org/en/docs/ngx_core_module.html#worker_processes
官方文档
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
Defines the number of worker processes.
The optimal value depends on many factors including (but not limited to) the number of CPU cores, the number of hard disk drives that store data, and load pattern. When one is in doubt, setting it to the number of available CPU cores would be a good start (the value “auto” will try to autodetect it).
翻译后的
语法:worker_processes 数量 | auto;
默认值:
worker_processes 1;
上下文:main
定义 worker 进程的数量。
最佳值取决于多种因素,包括(但不限于)CPU 核心数量、存储数据的硬盘驱动器数量以及负载模式。
当不确定时,将其设置为可用 CPU 核心的数量是一个好的开始(“auto”值将尝试自动检测)。
1. 启动一个默认的 nginx 服务
docker run --name nginx-worker -d -p 8080:80 nginx
2. 拷贝 nginx.conf 配置文件到当前目录
docker cp nginx-worker:/etc/nginx/nginx.conf .
3. nginx 配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
4. 查看 Nginx 工作进程的数量
要查看 Nginx 工作进程的数量,你可以使用几种不同的方法,这取决于你的操作系统。
下面是一些常用的方法:
1. 使用 Docker 命令查看进程
docker top nginx-worker
日志信息
PS C:\Users\Administrator\Desktop\nginx-course\nginx-worker_processes> docker top nginx-worker
UID PID PPID C STIME TTY TIME CMD
root 379 358 0 12:56 ? 00:00:00 nginx: master process nginx -g daemon off;
_rpc 414 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 415 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 416 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 417 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 418 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 419 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 420 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 421 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 422 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 423 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 424 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 425 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 426 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 427 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 428 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 429 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 430 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 431 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 432 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 433 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 434 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 435 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 436 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 437 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 438 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 439 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 440 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 441 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 442 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 443 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 444 379 0 12:56 ? 00:00:00 nginx: worker process
_rpc 445 379 0 12:56 ? 00:00:00 nginx: worker process
PS C:\Users\Administrator\Desktop\nginx-course\nginx-worker_processes>
根据 docker top nginx-worker
命令的输出结果,我们可以看到在你的 nginx-worker
容器中,存在一个主进程和多个工作进程。主进程通常显示为“nginx: master process”并且每个“nginx: worker process”代表一个工作进程。
在这个输出中,你有一个 Nginx 主进程和 27 个工作进程。这意味着你的 Nginx 配置设置了 27 个并发处理请求的工作进程。这可能是你在 Nginx 配置文件中明确指定的,或者如果你设置了 auto
,则 Nginx 可能自动为你的服务器的每个可用 CPU 核心分配了一个工作进程。
确保工作进程的数量与你服务器的 CPU 核心数匹配可以帮助提高处理能力和效率,尤其是在高并发请求的情况下。如果你有特定的性能需求或者想进一步优化配置,你可以调整 worker_processes
参数的值来适应你的服务器环境和负载情况。
2. 使用 ps
命令
在大多数类 Unix 系统(包括 Linux 和 macOS)上,你可以使用 ps
命令配合 grep
来查看正在运行的 Nginx 进程。打开终端或命令行界面,输入以下命令:
ps aux | grep nginx
这个命令会列出所有包含 "nginx" 关键字的进程。你可以看到每个进程的详细信息,包括进程号。一般来说,会有一个主进程和多个工作进程。主进程通常负责管理工作进程,而工作进程则负责处理实际的请求。
3. 查看 Nginx 日志
Nginx 的日志文件也可能提供关于工作进程启动和运行状态的信息。这取决于你的 Nginx 配置如何设置日志级别。通常,日志文件位于 /var/log/nginx/
目录下,但这可能因安装和配置而异。
4. 直接查看 Nginx 状态
如果你在 Nginx 中配置了状态模块(如 ngx_http_stub_status_module
),你可以通过访问一个特定的 URL 来查看服务器状态,包括活动连接数和工作进程的状态。这需要你在配置中添加类似以下的设置:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 只允许本地访问
deny all; # 拒绝其他所有访问
}
然后,你可以通过访问 http://your-server-ip/nginx_status
来查看状态。
5. 修改 nginx.conf 配置文件 worker_processes,并创建 Dockerfile
Dockerfile
# 使用 Nginx 官方镜像作为基础镜像
FROM nginx:1.25.4
# 覆盖nginx.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
nginx.conf 把 worker_processes auto;
改为 worker_processes 4;
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
停止并强制删除正在运行的 docker 容器
docker rm -f nginx-worker
构建镜像
docker build -t nginx-worker_processes .
构建镜像
docker run --name nginx-worker -d -p 8080:80 nginx-worker_processes
查看状态
docker ps -a
使用 docker top nginx-worker
命令查看进程
PS C:\Users\Administrator\Desktop\nginx-course\nginx-worker_processes> docker top nginx-worker
UID PID PPID C STIME TTY TIME CMD
root 768 747 0 13:19 ? 00:00:00 nginx: master process nginx -g daemon off;
_rpc 802 768 0 13:19 ? 00:00:00 nginx: worker process
_rpc 803 768 0 13:19 ? 00:00:00 nginx: worker process
_rpc 804 768 0 13:19 ? 00:00:00 nginx: worker process
_rpc 805 768 0 13:19 ? 00:00:00 nginx: worker process
PS C:\Users\Administrator\Desktop\nginx-course\nginx-worker_processes>
6. nginx master process 与 nginx worker process 的区别
在 Nginx 架构中,nginx master process
和 nginx worker process
扮演着不同但互补的角色。这两种类型的进程一起工作,确保 Nginx 能够高效、稳定地处理网络请求。
下面是对这两种进程的主要区别和功能的概述:
Nginx Master Process
- 管理角色:主进程主要负责管理和监控下属的工作进程。它不直接处理网络请求,而是承担配置管理、进程监控和控制的任务。
- 配置读取与应用:启动时,主进程读取并应用 Nginx 配置文件中的设置。如果配置文件被重新加载(例如,通过
nginx -s reload
命令),主进程会解析新配置并应用它,同时确保平滑地过渡到新的工作进程,无需中断服务。 - 工作进程管理:主进程负责启动、停止和维护工作进程的健康状态。如果工作进程出现崩溃,主进程可以重新启动它们,从而增强服务的稳定性。
Nginx Worker Process
- 请求处理:工作进程是实际处理客户端请求的进程。每个工作进程都能独立处理进入的连接,执行请求的读取、处理和响应。
- 并发能力:多个工作进程可以并行运行,每个进程都能处理多个连接。这种模型使得 Nginx 能高效地利用多核服务器的硬件资源,提升并发处理能力。
- 内存独立:每个工作进程都在自己独立的内存空间运行,它们之间不共享内存。这种设计简化了进程间的通信,并减少了资源竞争,但也意味着每个进程需要有自己的数据副本。
总结
主进程和工作进程的分工合作使得 Nginx 能够在提供高性能的同时,也保证了高可用性和灵活的配置管理。主进程作为一个控制中心,确保整个服务的平稳运行,而多个工作进程并行处理请求,确保处理速度和效率。这种架构特别适合高负载和高并发的网络应用场景。
参考资料
https://nginx.org/en/docs/ngx_core_module.html#worker_processes
https://nginx.org/en/docs/ngx_core_module.html#worker_connections
nginx 服务器 worker_processe https://blog.csdn.net/cxh20777/article/details/131206595
what is worker_processes and worker_connections in Nginx? https://stackoverflow.com/questions/23386986/what-is-worker-processes-and-worker-connections-in-nginx