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. 下载jdk12版本没有jre问题处理

    以往下载jdk1.6版本直接运行会生成jdk,jre两个文件,但今天下载jdk12运行后,只有jdk目录文件,并没有jre后来在网上查找后通过命令行方式手动生成jre 1.下载jdk12 网址:htt ...

  2. 28. Implement strStr()[E]实现strStr()

    题目 Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if need ...

  3. Java Break和continue实现goto功能

    continue实验 1 public class test { static int i =0; public static void main(String[] args) { lable1: w ...

  4. tinyxml使用

    1.下载地址 http://sourceforge.net/projects/tinyxml/ 2.tinyxml不仅支持Linux编译,同时也支持windows下编译,由于tinyxml仅有6个文件 ...

  5. winFrom线程

    方法--->委托--->BeginInvoke用指定的参数异步执行委托 委托就是我想做什么,而你可以作什么,我就让你去做.

  6. css简单介绍

    css层叠样式表,主要作用就是解决内容与表现分离的问题.html标签有自己的意义当然也是有自己的默认样式的,但有时候我们想修改他的样式,这时候就需要了css. 例:给字体加上颜色,我们有如下几种方法: ...

  7. Computer Vision的尴尬

    原文: Computer Vision是AI的一个非常活跃的领域,每年大会小会不断,发表的文章数以千计(单是CVPR每年就录取300多,各种二流会议每年的文章更可谓不计其数),新模型新算法新应用层出不 ...

  8. ie6 中文字符编码 出现的问题解决

    0 前言   公司要求网页要支持ie6.7.8,结果我的设备在ie7.8.9均工作正常,而在ie6时就出现各种奇怪的错误,在这个背景下,开始动手解决网页不兼容ie6的情况.   1 搭建ie6的实验平 ...

  9. 优动漫PAINT新建文件

    在优动漫PAINT软件中展开任何一项操作之前,都需要新建或打开图形文件.新建文件之后,用户可根据自己的需求进行相应的设置,这样将大大节省后期制作的时间! 在优动漫PAINT中新建图形文件的方法: 方法 ...

  10. Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

    一.spring依赖注入使用方式 @Autowired是spring框架提供的实现依赖注入的注解,主要支持在set方法,field,构造函数中完成bean注入,注入方式为通过类型查找bean,即byT ...