原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢!

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

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

master进程

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

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

worker进程

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

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

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

二、信号的处理过程

Master进程接收到信号是怎样进行处理的?

master进程接收到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接受新的请求,而老的进程在收到来自master信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后再退出。

Worker进程接收到信号是怎样进行处理的?

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

那么为了解决这个问题,Nginx提供了一个accept_mutex(可选项,默认打开)。这是一个加在accept上的一把共享所。有了这把锁之后,同一时刻,就会只有一个进程在accept连接,这样就不会有惊群问题了。

当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

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

三、这样设计的优点

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

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

2、负载均衡

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

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

这样做的好处是:

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

b.管理进程负责监控工作进程状态,如果某个工作进程死掉,管理进程负责创建出新的工作进程,避免系统性能下降。提高了系统的可靠性。

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

【转】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系列(三)--管理进程、多工作进程设计

    Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不须要处理网络事 ...

  9. 【转】Nginx系列(四)--工作原理

    原博文出于:    http://blog.csdn.net/liutengteng130/article/details/46724081  感谢! 上篇文章介绍了Nginx框架的设计之管理进程以及 ...

随机推荐

  1. (2)WinForm中改变Tab选项卡的顺序

    Tab选项卡选中,在其属性中找到TabPages这个属性.点进去,可以通过上下移动标签卡改变标签卡的顺序.

  2. HDFS小文件处理——Mapper处理

    处理小文件的时候,可以通过org.apache.hadoop.io.SequenceFile.Writer类将所有文件写出到一个seq文件中. 大致流程如下: 实现代码: package study. ...

  3. BZOJ 3132 上帝造题的七分钟(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...

  4. RTP协议之Header结构解析

    实时传输协议 RTP,RTP 提供带有实时特性的端对端数据传输服务,传输的数据如:交互式的音频和视频.那些服务包括有效载荷类型定义,序列号,时间戳和传输监测控制.应用程序在 UDP 上运行 RTP 来 ...

  5. wave文件(*.wav)格式、PCM数据格式

    1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采 ...

  6. poj 3181 Dollar Dayz

    题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...

  7. 【转】This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

    原文网址:http://1982106a.blog.163.com/blog/static/8436495620149239361692/ 预览layout.xml文件时提示: This versio ...

  8. Kotlin 语言高级安卓开发入门

    过去一年,使用 Kotlin 来为安卓开发的人越来越多.即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式.Jake Wharton ...

  9. ASIHttpRequest编译不通过

    转:http://blog.sina.com.cn/s/blog_67a5e47201014tof.html Undefined symbols for architecture i386:   &q ...

  10. Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

    一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目 ...