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. leetcode-easy-string-344 Reverse String

    mycode class Solution(object): def reverseString(self, s): """ :type s: List[str] :rt ...

  2. flutter column row布局的列表自适应宽高

    mainAxisSize: MainAxisSize.min

  3. ControlTemplate in WPF —— TextBox

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  4. python调用dll详解

    参考链接https://www.cnblogs.com/TQCAI/p/8881530.html https://www.jb51.net/article/52513.htm https://www. ...

  5. javaScript 实现倒计时 + 获取网页中的文字

    一.倒计时 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  6. html+css实现奥运五环(环环相扣)

    <!DOCTYPE html> <html> <head> <title>奥运五环</title> <style type=" ...

  7. yum源迁移(思路具体操作之后加)

    准备工作,有一台能联网的机器装有liunx系统 首先在联网机器下载yum系列包(yum命令如果不存在的话只能通过安装包的形式进行安装这里不考虑yum命令不存在情况) 修改配置文件使得yum命令只下载不 ...

  8. Linux执行命令./command与直接输入命令的区别

    我们知道查看文件属性的命令ls的完整文件路径为:/bin/ls(这是绝对路径,)问什么我可以在任何地方执行,任何目录下输入ls就一定可以显示出一些信息而不会说找不到该/bin/ls命令,这是因为不同的 ...

  9. C++:string操作函数

    要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...

  10. CF894E Ralph and Mushrooms

    题目 一眼题. 缩点然后dp. 注意一下计算一条边经过无限次可以获得多少价值这个东西要用到平方和公式. \(\sum\limits_{i=1}^ni^2=\frac{i(i+1)(2i+1)}6\) ...