nginx服务架构

模块

习惯上将nginx的模块分成核心模块,HTTP模块,邮件模块,以及第三方模块
核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理错误日志解析,配置解析;另一类是用于响应请求事件必须的功能,包括事件驱动机制,正则表达式;

对web服务器请求处理的机制

Web服务器和客户端是一对多的关系,完成并行处理的工作有三种方式:多进程方式,多线程方式,异步方式

多进程方式:

每当服务器收到一个请求的时候。就有服务器的主进程生成一个子进程出来与客户端建立连接,直到连接断开,该进程就结束了;
为了应对大量的请求,apache采用预派生进程的机制来对多进程进行改进。预进程机制就是在客户端还没有到来之前就预先生成好,当请求来的时候主进程分配一个进程与客户端进行交互,交互完成以后,该进程也不结束,而被主进程管理起来等待下一个客户请求的到来。

多线程

服务器主进程派生出一个线程来和该客户端进行交互。服务器生成一个线程的开销远比产生一个进程的开销小,多个线程位于同一个进程内,可以访问同样的内存空间,彼此之间相互影响;

异步方式:

同步机制:指发送方发送请求以后,需要等待接收方发出响应以后才接收下一个请求,
异步机制:发送方在发送一个请求以后,不等待接收方响应这个请求,就继续发送下一个请求,在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完以后才通知发送方;
阻塞和非阻塞用来描述进程调用的方式。主要指套接子的阻塞和非阻塞。
阻塞的调用方式指调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回以后,才进入就绪状态,获取CPU后继续执行。
非阻塞的方式是指如果调用没有马上返回,当前线程也不会挂起,而是立即执行下一个调用;
异步非阻塞方式:发送方向接收方发出请求以后,不用等待响应,可以继续执行其他的工作,接收方处理请求的时候如果不能马上得到结果,也不会等待,而是马上返回去去执行其他时请事情当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应给发送方。

nginx如何处理请求的呢

Nginx服务器能同时处理大量的请求,它结合了多进程机制和异步非阻塞机制

Nginx服务器启动以后,可以产一个主进程和多个worker进程。Nginx服务器的所有工作进程用于接收客户端请求,这有点类似apache的多进程机制,预先派生出工作进制,等待客户端请求;
每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。当某个IO请求不能立即得到结果的时候就去处理其他的请求,而客户端在此期间也无须等待响应,可以去处理其他的请求,当IO调用返回结果的时候就会通知此工作进程,该进程得知通知,暂时挂起当前事务的去响应客户端请求

nginx服务器的事件处理机制

IO调用结果如何把自己的状态告诉进程呢,一般有两种方案,1)让工作进程隔一段时间就去检查一下IO的运行状态,如果完成就去响应客户端,如果未完成就去继续工作,2)IO调用完成后主动通知工作进程,显然第二种方案比较好,
具体来说epoll/select/poll的系统调用就是第二种方案,也称为事件驱动模型;
【事件驱动模型】
事件驱动模型包括三个方面:事件收集器,事件发送器和事件处理器三个单元;

Select方式:

1)首先创建事件的描述符集合,对于一个事件,关注其上面的读事件,写事件和异常事件,所以要创建三类事件的描述符集合,分别用来收集读事件的描述符,写事件的描述符,和异常事件的描述符
2)其次调用底层select()函数,等待事件的发生,然后轮询所有事件描述符中的每一个描述符,检查是否有事件发生,如果有就处理。

Poll方式:

Poll和select方式相同,都是创建一个描述符的集合,再去等待事件的发生,然后再轮询描述符的集合,检查有没有事件的发生,
Poll和select的区别在于:select库需要为读事件,写事件,异常事件分别创建一个描述符集合,再最后轮询的时候,需要分别轮询三个集合,而poll库只需要创建一个集合,再每个描述符上对应的结构分别设置读事件,写事件,或者异常事件,最后轮询的时候,可以同时检查这三个事件是否发生;

Epoll库:

他们的处理方式都是创建一个待处理事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断是否有事情发生这样看来效率比较低下,一种比较好的做法就是把描述符列表的管理交给内核负责,一旦有某种事情发生,内核把发生事件的描述符通知给进程,这样就避免了轮询整个描述符列表。
Epoll就是这样作的
首先epoll通过相关调用通知内核创建一个有N个描述吗的列表,然后给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体的编码过程中也可以通过相关调用将列表中描述符删掉,
完成设置以后,epoll就开始等待内核通知事件了,某一事件发生以后,内核就将发生事件的描述符上报给epoll库,得知事件列表的epoll库,就可以开始进行事件处理了。

Epoll的高校在于:它支持一个进程打开大数目的事件描述符,上限是系统可以打开的文件的数目,同时epoll库的IO效率不随描述符增加而线性下降。
epoll有两种模式:水平触发和边缘触发
水平触发:内核通知进程来读取数据,进程没来读取数据,内核需要一次一次通知进程
边缘触发:内核只通知一次让进程来读取数据,进程可以在超时时间内随时来读取数据。

nginx的服务架构的更多相关文章

  1. Dubbo与Nginx微服务架构

    Dubbo的负载均衡已经是服务层面的了,和nginx的负载均衡还在http请求层面完全不同.至于二者哪个优秀,当然没办法直接比较. 涉及到负载均衡就涉及到你的业务,根据业务来选择才是最适合的. dub ...

  2. 教你如何用Nginx搭建一个安全的、快速的微服务架构

    今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo. 在我们探讨Fabric模式之前,我 ...

  3. 庐山真面目之二微服务架构NGINX版本实现

    一.简介          在上一篇文章<庐山真面目之微服务的简介和技术栈>中,我们已经探讨了微服务的来龙去脉,也说了想要实现微服务架构所需要的技术栈,今天我们开始实现一个微服务,当然这个 ...

  4. 庐山真面目之四微服务架构Consul集群和Nginx版本实现

    庐山真面目之四微服务架构Consul集群和Nginx版本实现 一.简介      在上一篇文章<庐山真面目之三微服务架构Consul版本实现>中,我们已经探讨了如何搭建基于单节点Consu ...

  5. 庐山真面目之六微服务架构Consul集群、Ocelot网关集群和Nginx版本实现

    庐山真面目之六微服务架构Consul集群.Ocelot网关集群和Nginx版本实现 一.简介      在上一篇文章<庐山真面目之五微服务架构Consul集群.Ocelot网关和Nginx版本实 ...

  6. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  7. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  8. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  9. 互联网保险O2O平台微服务架构设计(转)

    非常感谢http://www.cnblogs.com/skyblog/p/5044486.html 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因 ...

随机推荐

  1. pandas dataframe类型操作

    用python做数据分析pandas库介绍之DataFrame基本操作   怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这 ...

  2. day8_文件操作及编码解码

    一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...

  3. phpmyadmin python mysql全部正常显示中文的关键

    1. 建表.列时在phpmyadmin中将编码设置为utf8_general_ci 2. python中使用sql连接时设定charset为utf8,注意不能是utf-8! 例如: def Conne ...

  4. iOS 图表工具charts之CombinedChartView

    关于charts的系列视图介绍传送门: iOS 图表工具charts介绍 iOS 图表工具charts之LineChartView iOS 图表工具charts之BarChartView iOS 图表 ...

  5. wpf的控件style

    前段时间一直在做wpf的UI开发,每次想做些控件style定制的时候都很头疼 很多控件不知道他的controltemplate是什么样的 为了方便大家写style 特别奉上wpf的style大全 从此 ...

  6. linux 代码更新-打包-重启脚本

    #! /bin/sh base=/home/project/myblog cd $base git pull ] then echo "Error in git pull!!! Stop d ...

  7. Delphi实现带有格式的Excel导出功能

    功能预览 运行预览 模板样式 存储返参 导出的Excel 2. 代码实现 //执行sql的函数 procedure TForm1.GetReportData(astrsql:string); var ...

  8. CSS进阶学习

    5种主流浏览器及内核 IE  trident Chrome webkit/blink Firefox  gecko Opera presto 3%-5% Safari webkit css引入三种方式 ...

  9. 如何解决idea本身的乱码以及解决代码中出现的乱码?

    1:解决idea中控制台的乱码现象(3中方法): 第一种: 如图需要找到idea的安装路径: idea\IntelliJ IDEA 2018.3.2\bin 在这个路径下面有一个文件叫:idea64. ...

  10. 【VS开发】【图像处理】V4L2 pixel format

    目录(?)[-] v4l2_pix_format定义 2 具体Pixel Format定义 1. v4l2_pix_format定义 [cpp] view plain copy /* *  V I D ...