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. ImportError: cannot import name 'Document'

    一种常见的原因是,程序文件的名字不对. 程序文件的名字不能和 import lib 里的名字冲突. 一个例子: 如果程序文件名字是 docx.py,程序又 from docx import Docum ...

  2. nodejs之静态文件托管、 路 由、EJS 模板引擎、GET、POST

    1.静态文件托管 静态文件托管:是指对于一个js方法进行封装,提高代码可读性 //fs模块 var fs=require('fs'); //path模块 var path=require('path' ...

  3. Jmeter(七)参数化

    初识Jmeter的时候, 除了感觉安装和配置都很轻量以外, 还有一个最大的感触就是, 翻译真硬啊, 真的够够的! 和他磨合了挺长一段时间之后, 终于开悟了, 这些硬硬的翻译, 其实还是基本靠谱的, 看 ...

  4. rocketMQ broker 分发并处理请求

    使用 netty 监听端口 // org.apache.rocketmq.remoting.netty.NettyRemotingServer#start ServerBootstrap childH ...

  5. pureftp安装部署

    ftp:文件传输pure-ftpd:ftp软件作用:通过映射登录传送和接收文件.1.先下载pure-ftpd软件,最好指定一个下载软件目录如:/usr/local/src wget https://d ...

  6. Linux下源码安装MySQL-5.6.25

    从mysql-5.5起,mysql源码安装开始使用cmake了,因此我们得先安装cmake,配置安装目录./configure --perfix=/.....的时候和以前的会有些区别. 一.安装cma ...

  7. 微信小程序---交互反馈

    1.学习大纲: 2.showToast(): wx.showToast({ title: '成功', icon: 'success', duration: }) 3.hieToast(): wx.sh ...

  8. zabbix图形刷新延迟解决

    环境: 服务端    ip :192.168.1.204       hostname:www.test.com 服务端    ip :192.168.1.206       hostname:www ...

  9. MySQL 常见面试知识点

    之前简单总结了一下MySQL的场景面试知识点 1.讲下MVCC原理 2.MySQL高可用架构介绍 3.OSC(在线更改表结构)原理 4.MySQL性能调优有哪些关键点/经验 5.MySQL在线备份方案 ...

  10. Angular5 reactive Forms Listening for Changes 监听表单变化

    在html 中定义了 FromGroup,怎么来监听用户输入值的变化呢? 可以使用valueChanges 来订阅变化. this.myForm.valueChanges.subscribe(val ...