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 进程发送信号而已。

Nginx 的进程结构,你明白吗?的更多相关文章

  1. nginx系列6:nginx的进程结构

    nginx的进程结构 如下图: 通过ps –ef | grep nginx可以看到共有三个进程,一个master进程,两个worker进程. nginx是多进程结构,多进程结构设计是为了保证nginx ...

  2. nginx的进程结构实例演示

    nginx父子进程之间是使用信号进行管理的. nginx -s reload 会使之前的nginx子进程退出,生成新的nginx子进程 或者kill -SIGHUP 9170 kill -SIGTER ...

  3. nginx的进程结构

    nginx分为单进程和多进程,默认是多进程 进程架构: 父进程master process  子进程worker process和cache manager cache loader 高可用性 高可靠 ...

  4. Java高级架构师(一)第32节:Nginx的进程结构、基本配置

    核心模块.事件模块.标准Http模块.可选Http模块.邮件模块.第三方模块和补丁.

  5. Nginx系列p4:进程结构

    Nginx 有两种进程结构:单进程结构,多进程结构.本篇文章我们主要说多进程结构. 问:那为什么 Nginx 采用多进程结构,而不是多线程结构呢? 答:这是因为 Nginx 最核心的目的就是要保证高可 ...

  6. Nginx的进程模型及高可用方案(OpenResty)

    1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...

  7. Linux程序存储结构与进程结构 堆和栈的差别

    摘要:本文主要讲述了Linux系统中.程序存储结构(代码区.数据段和BBS区)与进程的基本结构(代码区.数据段.BBS区.堆和栈).以及堆和栈的差别. Linux程序存储结构与进程结构 1.Linux ...

  8. nginx的进程模型

    nginx采用的也是大部分http服务器的做法,就是master,worker模型,一个master进程管理站个或者多个worker进程,基本的事件处理都是放在woker中,master负责一些全局初 ...

  9. 【nginx】【转】Nginx核心进程模型

    一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程.   ...

随机推荐

  1. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  2. python编程基础之十二

    列表:一种有序的集合,可以同时存储多个数据,列表元素可修改,属于可变序列 创建列表: 列表名 = [列表选项一,列表选项二,列表选项三,......] list1 = [] list2 = [10,2 ...

  3. 从零开始入门 K8s | Kubernetes 网络概念及策略控制

    作者 | 阿里巴巴高级技术专家  叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什 ...

  4. 刨ThreadLocal的坟

    ThreadLocal是大家比较常用到的,在多线程下存储线程相关数据十分合适.可是很多时候我们并没有深入去了解它的原理. 首选提出几个问题,稍后再针对这些问题一一解答. 提到ThreadLocal,大 ...

  5. Python3之多线程学习

    这里做一个自己复习多线程的笔记 Python中使用线程有两种方式:函数或者用类来包装线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: ...

  6. shark恒破解笔记5-VB之rtcMsgBox

    本次是来破解一个名为”系统提速精灵“的软件,方法是对rtcMsgBox下断点. 运行程序输入假码,会提示“注册码错“ 在oep上面可以看到大量vb引擎函数  明显的VB程序 载入OD对rtcMsgBo ...

  7. [NOIp2010] luogu P1541 乌龟棋

    英语老师讲 mind map,真想说一句"声微饭否".为什么wyy的歌词总是快一点点.在报csp. 题目描述 你在一个序列上向正方向行走,起点是 a[0]a[0]a[0].每一步可 ...

  8. 高通电源管理函数的power_supply的调用关系

    以msm8909为例,高通的主要文件有几个: qpnp-linear-charger.c(线性充电器) qpnp-vm-bms.c(BMS管理) power_supply_core.c(power_s ...

  9. 利用Arthas定位线上问题实例

    前言 Arthas是一个类似于Btrace的JVM在线调试分析工具,具体可参考我之前写的一篇博客:利用JVM在线调试工具排查线上问题.本文分享笔者刚遇到的一个问题,虽然不复杂,但是很典型. 问题与分析 ...

  10. Dell R720 RAID配置

    Dell服务器上一般都带有Raid卡,Raid5配置请看下边,亲们 1. 将服务器接上电源,显示器,键盘,并开机 2. 按 ctrl + R进入Raid设置 3. 将光标放置在Raid卡那,按F2,选 ...