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. Windows API 编程入门

    Windows 工作原理的中心思想就是“动态链接”概念.Windows 自身带有一大套函数,应用程序就是通过调用这些函数 来实现它的用户界面和在屏幕上显示文本和图形的.这些函数都是在动态链接库里实现的 ...

  2. Vmware Ubuntu 开机蓝屏

    引用:http://tieba.baidu.com/p/4898482611 1. 这是vm的一个bug!!!打开你的虚拟系统目录,编辑虚拟机文件夹下面的.vmx 用记事本打开,加入代码. cpuid ...

  3. Zeppelin的安装和SparkSQL使用总结

    zeppelin是spark的web版本notebook编辑器,相当于ipython的notebook编辑器. 一Zeppelin安装 (前提是spark已经安装好) 1 下载https://zepp ...

  4. 深入了解一下HTTP缓存机制

    HTTP 缓存机制作为 web 性能优化的重要手段,是Web 开发知识体系库中的一个基础环节,但是对于很多学习者来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的, ...

  5. Spring入门(五):Spring中bean的作用域

    1. Spring中bean的多种作用域 在默认情况下,Spring应用上下文中所有的bean都是以单例(singleton)的形式创建的,即不管给定的一个bean被注入到其他bean多少次,每次所注 ...

  6. php后端开发要学什么

    PHP历史: 1994年创建,1995年对外发表第一个版本,名为:personal home page tools,之后发表PHP1.0.1995年中期,PHP2.0,从此建立了PHP在动态网站开发的 ...

  7. robotframework+ride+python3环境搭建

    一.windows下安装python3.6 1.官网下载安装包https://www.python.org/downloads/windows/ 2.进行安装,接下来步骤一直next即可 二.cmd下 ...

  8. alinode与node性能测试方法与分析

    需求和技术指标整理 node服务在引入node性能监控过程中,需要使用alinode,为了对alinode与官方node各项性能指标的差异有进一步的认识,现开展以下调研.测试. 原理性分析 alino ...

  9. sql查询入门

    SQL语言是一门相对来说简单易学却又功能强大的语言,它能让你快速上手并很快就能写出比较复杂的查询语句.但是对于大多数开发者来说,使用SQL语句查询数据库的时候,如果没有一个抽象的过程和一个合理的步骤, ...

  10. SpringMVC重点知识总结

    SpringMVC总结 1. SpringMVC简介 MVC即模型-视图-控制器(Model-View-Controller) Spring Web MVC是一种基于Java的实现了Web MVC设计 ...