Skip to content

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 服务

bash
docker run --name nginx-worker -d -p 8080:80 nginx

2. 拷贝 nginx.conf 配置文件到当前目录

bash
docker cp nginx-worker:/etc/nginx/nginx.conf .

3. nginx 配置文件

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 命令查看进程

bash
docker top nginx-worker

日志信息

powershell
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 进程。打开终端或命令行界面,输入以下命令:

bash
ps aux | grep nginx

这个命令会列出所有包含 "nginx" 关键字的进程。你可以看到每个进程的详细信息,包括进程号。一般来说,会有一个主进程和多个工作进程。主进程通常负责管理工作进程,而工作进程则负责处理实际的请求。

3. 查看 Nginx 日志

Nginx 的日志文件也可能提供关于工作进程启动和运行状态的信息。这取决于你的 Nginx 配置如何设置日志级别。通常,日志文件位于 /var/log/nginx/ 目录下,但这可能因安装和配置而异。

4. 直接查看 Nginx 状态

如果你在 Nginx 中配置了状态模块(如 ngx_http_stub_status_module),你可以通过访问一个特定的 URL 来查看服务器状态,包括活动连接数和工作进程的状态。这需要你在配置中添加类似以下的设置:

nginx
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

Dockerfile
# 使用 Nginx 官方镜像作为基础镜像
FROM nginx:1.25.4

# 覆盖nginx.conf
COPY ./nginx.conf /etc/nginx/nginx.conf

nginx.conf 把 worker_processes auto; 改为 worker_processes 4;

nginx
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 容器

bash
docker rm -f nginx-worker

构建镜像

bash
docker build -t nginx-worker_processes .

构建镜像

bash
docker run --name nginx-worker -d -p 8080:80 nginx-worker_processes

查看状态

bash
docker ps -a

使用 docker top nginx-worker 命令查看进程

powershell
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 processnginx 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