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. 项目二:企业级java电商网站开发(服务端)

    声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...

  2. java动手动脑和动手实验

    动手动脑一: EnumTest.java: 程序代码: public class EnumTest { public static void main(String[] args) { Size s= ...

  3. 如何更快理解和运用服务编排?(使用Goku API Gateway实现)

    上一篇博客 未来实现API管理系统的几个关键词 发布后,有不少读者私信我,让我写一篇实际运用的文章,我周末趁着有空写了这篇有关“服务编排”的文章.用的是Goku API Gateway进行演示, 希望 ...

  4. 无 PowerShell.exe 执行 Empire 的几种姿势

    在实战中,Empire成为域渗透.后渗透阶段一大利器,而Empire是一个Powershell RAT,所以PowerShell必须要能运行Empire中几乎所有的启动方法都依赖于使用PowerShe ...

  5. CSP-S 初赛内容整理

    图灵奖 艾伦·麦席森·图灵(Alan Mathison Turing,1912-1954)1966 共计70名科学家获此殊荣,华人仅有1位,他是2000年姚期智. 解释型语言 Python / Jav ...

  6. if循环判断

    if循环判断 if-else循环的语法格式 if 逻辑判断句: ​ 代码块 # 缩进表示所属关系 else 逻辑判断句: ​ 代码块 if 和elif同时使用来做多层判断 if 逻辑判断式: 代码块 ...

  7. {每日一题}:四种方法实现打印feibo斐波那契数列

    刚开始学Python的时候,记得经常遇到打印斐波那契数列了,今天玩玩使用四种办法打印出斐波那契数列 方法一:使用普通函数 def feibo(n): """ 打印斐波那契 ...

  8. 推荐几个IT交流社区

    博客园,csdn,掘金,StackOverflow(境外),v2ex,开源中国,简书,头条

  9. Spring 源码阅读之 深入理解 finishBeanFactoryInitialization

    源码入口 上篇博文中我们看到了将Spring环境中的 BeanPostProcessor找出来,添加到BeanFactory中的beanPostProcessors中,统一维护,本片博文继续往下拓展, ...

  10. centos 7.6修改ssh端口,设置防火墙规则

    一.修改ssh端口 1 使用 root 用户进入 /etc/ssh目录 2 备份ssh配置文件 cp sshd_config sshd_config-bak 3 使用 vim 打开 sshd_conf ...