Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程。

一、master进程和worker进程的作用

master进程

不须要处理网络事件。不负责业务的运行,仅仅会通过管理worker等子进程来实现重新启动服务、平滑升级、更换日志文件、配置文件实时生效等功能。

master是通过fork系统调用子进程来实现和子进程的通信。

worker进程

用来处理master进程fork过来的请求

worker进程是通过处理信号来实现和master通信的

====================================================================================

二、信号的处理过程

Master进程接收到信号是如何进行处理的?

master进程接收到信号后,会先又一次载入配置文件,然后再启动新的进程,并向全部老的进程发送信号,告诉他们能够光荣退休了。

新的进程在启动后,就開始接受新的请求,而老的进程在收到来自master信号后。就不再接收新的请求,而且在当前进程中的全部未处理完的请求处理完毕后再退出。

Worker进程接收到信号是如何进行处理的?

首先。worker进程之间是平等的,每一个进程,处理请求的机会也是一样的。当我们提供80port的http服务时,一个连接请求过来,每一个进程都有可能处理这个连接,怎么做到的呢?首先。每一个worker进程都是从master进程fork过来的,在master进程里面,先建立好须要listen的socket之后。然后再fork出多个worker进程。这样每一个worker进程都能够去接受这个socket。一般来说,当一个连接进来后,全部在accept这个socket上面的进程都会收到通知,而仅仅有一个进程能够接受这个连接,其它的则accept失败。这就是所谓的惊群现象。

那么为了解决问题。Nginx提供了一个accept_mutex(可选项,默认打开)。

这是一个加在accept上的一把共享所。有了这把锁之后,同一时刻。就会仅仅有一个进程在accept连接,这样就不会有惊群问题了。

当一个worker进程在accept这个连接之后,就開始读取请求。解析请求,处理请求。产生数据后,再返回给client。最后才断开连接。

一个请求,全然由worker进程来处理。并且仅仅在一个worker进程中处理。

====================================================================================

三、这样设计的长处

1、利用多核系统的并发处理能力

如今操作系统都是多核CPU,假设一直是仅仅有一个进程在工作,那么浪费资源,假设是worker进程间地位不平等势必造成进程瓶颈问题,Nginx为了避免这个问题,设计worker间进程平等。另外,worker数与cpu核数一致。则会达到CPU资源的充分利用,假设worker数多于cpu核数,势必造成资源的竞争;若小于cpu核数。势必造成资源浪费。提高网络性能。减少请求时延。

2、负载均衡

多个worker之间通过进程通信来实现负载均衡。即当一个请求到来时,更easy分配到负载较轻的worker进程中处理。这将减少请求的时延。并在一定程度上提高网络性能

3、管理进程负责监控工作进程的状态,并负责管理其行为

这样做的优点是:

a.管理进程不会占用多少系统资源

b.管理进程负责监控工作进程状态,假设某个工作进程死掉,管理进程负责创建出新的工作进程,避免系统性能下降。

提高了系统的可靠性。

c.管理进程支持Nginx服务执行中的程序升级、配置项改动等,使得动态可扩展性、动态定制性、动态进化性较easy实现。

Nginx系列(三)--管理进程、多工作进程设计的更多相关文章

  1. Nginx之监控进程和工作进程

    1. 函数调用分析 在开启 master 的情况下,多进程模型的下的入口函数为 ngx_master_process_cycle,如下: int mian() { ... if (ngx_proces ...

  2. Nginx系列三 内存池的设计

    Nginx的高性能的是用非常多细节来保证,epoll下的多路io异步通知.阶段细分化的异步事件驱动,那么在内存管理这一块也是用了非常大心血.上一篇我们讲到了slab分配器,我们能够能够看到那是对共享内 ...

  3. Nginx学习笔记1-Nginx功能模块以及进程管理

    1.         功能 1.1.           功能描述 使用缓存加速反向代理,简单负载均衡和容错: 使用缓存机制加速远程FastCGI服务器的访问: 模块化结构: 基本的HTTP功能: 邮 ...

  4. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

  5. nginx第三天

    nginx架构分析 nginx模块化 nginx基于模块设计,每个模块是一个功能实现,分布式开发,团队协作 核心模块,标准http模块,可选http模块,邮件模块,第三方模块 编译后的源码目录  ob ...

  6. Nginx系列4之基础配置

    preface 公司跑得大多数是LNMP平台,所以借此机会多多了解下Nginx.下面主要说说Nginx下面几点: 防盗链 日志切割 负载均衡 虚拟主机 location匹配解释 substatus状态 ...

  7. Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。

    测试的代码主要功能:开启一个tcp服务器.然后设置了管理进程和工作进程start的回调进行更名.设置了pid_file保存了服务端启动的mast进程. <?php //创建Server对象,监听 ...

  8. 【转】Nginx系列(三)--管理进程、多工作进程设计

    原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢! Nginx由一个master进程和多个worker进程组 ...

  9. nginx学习(三):nginx的进程模型

    概述 nginx 进程分为 master进程和work进程 1.打开配置文件查看,这里我修改为2 [root@xxx conf]# vim nginx.conf #user nobody; worke ...

随机推荐

  1. shp系列(六)——利用C++进行Dbf文件的写(创建)

    上一篇介绍了shp文件的创建,接下来介绍dbf的创建. 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 1.Dbf头文件的创建 Dbf头文件的结构 ...

  2. 数组、链表、栈、队列和STL

    数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...

  3. BZOJ 2002 LCT板子题

    思路: LCT啊... (分块也行) 不过YOUSIKI出了一道“弹飞大爷” 就不能用分块水过去了 //By SiriusRen #include <cstdio> #include &l ...

  4. 适配器模式(adapter)C++实现

    意图:将一个类的接口转换成客户希望的另一个接口. 适用性:1.你想使用一个已存在的类,而它的接口不符合你的需求. 2.你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类协同工作. 类适配 ...

  5. 第6章 服务模式 在 .NET 中实现 Service Gateway(服务网关)

    上下文 您正在设计企业应用程序,该程序需要使用由其他应用程序提供的服务.该服务定义了一个合约,所有服务使用者要访问该服务都必须遵守该合约.该合约定义了与此服务通信所需的技术.通信协议和消息定义等内容. ...

  6. SQL学习整理

    SQL整理 SQL 对大小写不敏感! 一.对数据的操作 实现功能分类: 1. 增: 1.1 表存在,插入栏位: //插入新的行(按栏位的顺序插入) INSERT INTO Table_1 VALUES ...

  7. mybatis 高级映射和spring整合之与Spring整合(6)

    mybatis 高级映射和spring整合之mybatis与Spring整合 3.0 mybatis和spring整合(掌握) 3.1 整合思路 需求spring通过单例方式管理SqlSessionF ...

  8. c++ windows与linux通信中文乱码问题解决方法

    在linux中默认编码方式是UTF-8,在Windows下默认编码方式时GB2312.因此,在Windows和Linux进行通信的时候,如果没有进行转码则会出现乱码问题.因此,需要进行UTF-8和GB ...

  9. linq.sort

    reflections.Sort(delegate(ReflectionEntity a, ReflectionEntity b) { if (a.CreatedTime < b.Created ...

  10. 易观OLAP算法大赛结果揭晓,开源组黑马放大招!

    100+天激烈赛程,40+国内顶级技术豪门对决,历经研发内部测试.正式环境测试和易观数据正式环境跑benchmark三大阶段.10月28日,易观OLAP算法大赛优胜名单出炉! 40+技术门派比武 易观 ...