Nginx 的进程结构,你明白吗?

本文深入探讨Nginx的进程结构,包括单进程与多进程模型,重点讲解多进程结构中的父进程(Master Process)与子进程(Child Processes)的角色,以及worker进程和cache相关进程的功能。通过实例演示Nginx如何通过信号机制优雅地重启和管理worker进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【北京】 IT技术人员面对面试、跳槽、升职等问题,如何快速成长,获得大厂入门资格和升职加薪的筹码?与大厂技术大牛面对面交流,解答你的疑惑。《从职场小白到技术总监成长之路:我的职场焦虑与救赎》活动链接:码客

恭喜fpx,新王登基,lpl*b 我们是冠军

Nginx 进程结构

这篇文章我们来看下 Nginx 的进程结构,Nginx 其实有两种进程结构:

  • 单进程结构
  • 多进程结构

单进程结构实际上不适用于生产环境,只适合我们做开发调试使用。因为在生产环境中我们必须保持 Nginx 足够健壮以及 Nginx 可以利用多核的一个特性,而单进程的 Nginx 是做不到这一点的,所以默认的配置中都是打开为多进程的 Nginx。

我们来看一下,多进程的 Nginx 结构中它的进程模型是怎样的。

Nginx进程结构

多进程中的 Nginx 进程架构如下图所示,会有一个父进程(Master Process),它会有很多子进程(Child Processes),这些子进程会分为两类:

  • worker 进程
  • cache 相关的进程
为什么 Nginx 采用多进程结构而不是多线程结构呢?

因为 Nginx 最核心的一个目的是要保持高可用性、高可靠性,而当 Nginx 如果使用的是多线程结构的时候,因为线程之间是共享同一个地址空间的,所以当某一个第三方模块引发了一个地址空间导致的段错误时、在地址越界出现时,会导致整个 Nginx 进程全部挂掉。而当采用多进程模型时,往往不会出现这样的问题。从上图可以看到 Nginx 在做进程设计时,同样遵循了实现高可用、高可靠这样的一个目的。

比如说在 master 进程中,通常第三方模块是不会在 master 部分加入自己的功能代码的。虽然 Nginx 在设计时,允许第三方模块在 master 进程中添加自己独有的、自定义的一些方法,但是通常没有第三方模块这么做。

master 进程被设计用来的目的是做 worker 进程的管理的,也就是所有的 worker 进程是处理真正的请求的,而 master 进程负责监控每个 worker 进程是不是在正常的工作、需不需要做重新载入配置文件、需不需要做热部署。

而 cache (缓存)是在多个 worker 进程间共享的,而且缓存不仅要被 worker 进程使用,还要被 cache manager 和 cache loader进程 使用。cache manager 和 cache loader 也是为反向代理时,后端发来的动态请求做缓存所使用的,cache loader 只是用来做缓存的载入、cache manager 用来做缓存的管理。实际上每个请求处理时,使用到缓存还是由 worker 进程来进行的。

这些进程间的通讯,都是使用共享内存来解决的。可以看到cache manager 和 cache loader各有一个进程,master 进程因为是父进程,所以肯定只有一个。那么 worker 进程为什么会有很多呢?这是因为 Nginx 采用了事件驱动引擎以后,他希望每一个 worker 进程从头到尾占有一颗CPU,所以往往不止要把 worker 进程的数量配置与我们服务器上的 CPU核数一致以外,还需要把每一个worker进程与某一颗CPU核绑定在一起,这样可以更好的使用每颗CPU核上面的CPU缓存来减少缓存失效的命中率。

以上就是 Nginx 的进程结构的介绍,了解这些后更有助于我们去配置 Nginx。

刚才我们介绍了 Nginx 使用了多进程模型,由 master 作为父进程启动许多子进程,也知道了 Nginx 父子进程之间是通过信号来管理的,接下来通过一个实例给大家直观的看下父子进程以及信号之间是如何工作的。

Nginx 的进程结构实例

首先启动 Nginx,并在 Nginx 中启动了两个 worker 进程,通过 ps 命令可以看到当前进程 PID 和父进程 PID,有一个 nginx master 进程是由 root 用户起的,进程 PID 是 2368。还有两个 worker 进程和 cache 进程,它们是由 2368 进程起来的。它们的进程 PID 分别为 8652,8653,8655。

现在我们使用 ./sbin/nginx -s reload 命令,会把之前的 worker 进程和 cache 进程优雅的退出,然后再使用的新的配置项启动新的 worker 进程,这里我们并没有改变配置,但是我们可以看到老的三个子进程会退出,并生成新的子进程。

可以看到,之前的三个子进程,现在已经都不在了,反而由 2368 新起了 8657,8658,8660 三个子进程。

[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4751  4688  0 11:41 pts/0    00:00:00 grep --color=auto nginx
nginx     8652  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8653  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8655  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
[root@wupx nginx]# ./sbin/nginx -s reload
[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:43 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8658  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process

执行命令之后可以看到 worker 的 PID 已经变化了(之前讲过 ./sbin/nginx -s reloadkill -SIGHUP 作用是一样的。)。

kill -SIGTERM 是向现有的 worker 进程发送退出的信号,对应的 worker 进程就会退出;进程在退出时,会自动向父进程 master 发送一个退出信号,master 就知道他的子进程退出了,然后新起一个 worker 进程。

[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:43 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8658  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
[root@wupx nginx]# kill -SIGTERM 8658
[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:44 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
nginx     8663  2368  0 Nov12 ?        00:00:00 nginx: worker process

通过实例演示,我们可以看到 Nginx 的进程结构以及 Nginx 使用信号的方式,其实命令行中的许多子命令就是再向 master 进程发送信号而已。
在这里插入图片描述
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

<think>好的,我现在需要回答用户关于Nginx是什么的问题。首先,我得确保自己正确理解Nginx的核心概念和主要用途。Nginx一个高性能的Web服务器,同时也被用作反向代理、负载均衡器和HTTP缓存。我应该从这些基本点入手,逐步展开说明。 接下来,用户可能对Nginx的背景感兴趣,所以应该提到它的起源。Nginx由Igor Sysoev开发,最初是为了解决C10K问题,即同时处理大量并发连接。这一点很重要,因为它突出了Nginx的高效性能。 然后,我需要分点列出Nginx的主要功能和特点。例如,作为Web服务器,它处理静态内容高效;作为反向代理,可以分发请求到后端服务器;负载均衡功能能提升应用的可用性;HTTP缓存减少服务器负载,加快响应速度。这些功能应该用简洁的中文解释,避免技术术语过多,让用户容易理解。 还要比较Nginx和其他服务器比如Apache的区别,特别是在处理并发连接时的不同模型,比如事件驱动和异步非阻塞机制。这能帮助用户理解为什么Nginx在高并发场景下表现更好。 另外,用户可能想知道Nginx的应用场景,比如大型网站、微服务架构、CDN等。这些实际用例能帮助用户将理论联系实际,明白Nginx在现实中的用途。 需要检查是否有遗漏的重要信息,比如配置文件的语法、模块化设计,或者社区和支持情况。这些虽然不是核心,但对于全面了解Nginx有帮助。 最后,要确保回答结构清晰,分点说明,符合用户要求的逐步解决问题的结构。同时,所有数学表达式如果出现的话,必须用正确的LaTeX格式,但这个问题可能不太涉及数学内容,所以重点放在文本的组织和准确性上。 现在把这些思路整理成连贯的中文段落,确保每个部分自然过渡,信息准确,并且符合用户给出的格式要求。避免使用复杂术语,保持口语化,同时保持专业性。可能还需要举例说明某些功能,比如反向代理的具体工作流程,或者负载均衡的策略,这样用户更容易理解。 检查是否有错误,比如Nginx的发音是否正确(engine x),以及最新版本的特性是否需要提及,但可能基础介绍不需要太深入版本细节。确保提到开源和商业版本,让用户知道有不同选择。 总结一下,回答的结构应该是:定义、起源、主要功能、特点、应用场景、与Apache的对比,最后总结优势。这样用户能逐步了解Nginx的全貌。</think>Nginx(发音为“engine x”)是一款**高性能的开源Web服务器**,同时也可作为**反向代理**、**负载均衡器**和**HTTP缓存**使用。以下是逐步介绍: --- ### 1. **起源与设计目标** - **开发背景**:由俄罗斯工程师Igor Sysoev于2004年发布,旨在解决传统服务器(如Apache)的**C10K问题**(即单机同时处理上万个并发连接)。 - **核心优势**:通过**事件驱动**和**异步非阻塞**的架构,高效处理高并发请求,占用内存少。 --- ### 2. **主要功能** #### (a) **Web服务器** - 擅长快速处理静态内容(如HTML、图片),性能优于传统服务器。 - 示例配置: ```nginx server { listen 80; server_name example.com; root /var/www/html; } ``` #### (b) **反向代理** - 接收客户端请求后,转发给后端服务器(如Tomcat、Node.js),并返回结果给客户端。 - 用途:隐藏后端服务器信息,提升安全性。 #### (c) **负载均衡** - 将流量分发到多个服务器,避免单点过载。 - 支持策略:轮询、加权轮询、IP哈希等。 ```nginx upstream backend { server 192.168.1.1 weight=3; server 192.168.1.2; } ``` #### (d) **HTTP缓存** - 缓存静态资源或动态内容,减少后端压力,加速响应。 --- ### 3. **核心特点** - **高并发**:单机可支持数万并发连接。 - **低资源消耗**:内存占用远低于Apache。 - **模块化设计**:支持通过模块扩展功能(如SSL、gzip压缩)。 - **热部署**:更新配置或版本时无需重启服务。 --- ### 4. **与Apache的对比** | 特性 | Nginx | Apache | |---------------------|--------------------------------|----------------------| | 并发模型 | 事件驱动、异步非阻塞 | 多线程/多进程 | | 静态内容性能 | 更高 | 较低 | | 动态内容处理 | 需反向代理到后端语言 | 原生支持(如PHP) | | 配置灵活性 | 简洁 | 更复杂(.htaccess) | --- ### 5. **典型应用场景** - **大型网站**:如Netflix、GitHub使用Nginx处理高流量。 - **微服务架构**:作为API网关,路由不同服务请求。 - **内容分发网络(CDN)**:缓存和加速静态资源分发。 --- ### 6. **开源与商业版本** - **开源版**:功能齐全,社区活跃。 - **Nginx Plus**:商业版提供高级功能(如实时监控、技术支持)。 --- ### 总结 Nginx凭借**高性能**和**灵活性**,成为现代Web架构的核心组件,尤其适合高并发、需稳定性和低延迟的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值