nginx的服务架构
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的服务架构的更多相关文章
- Dubbo与Nginx微服务架构
Dubbo的负载均衡已经是服务层面的了,和nginx的负载均衡还在http请求层面完全不同.至于二者哪个优秀,当然没办法直接比较. 涉及到负载均衡就涉及到你的业务,根据业务来选择才是最适合的. dub ...
- 教你如何用Nginx搭建一个安全的、快速的微服务架构
今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo. 在我们探讨Fabric模式之前,我 ...
- 庐山真面目之二微服务架构NGINX版本实现
一.简介 在上一篇文章<庐山真面目之微服务的简介和技术栈>中,我们已经探讨了微服务的来龙去脉,也说了想要实现微服务架构所需要的技术栈,今天我们开始实现一个微服务,当然这个 ...
- 庐山真面目之四微服务架构Consul集群和Nginx版本实现
庐山真面目之四微服务架构Consul集群和Nginx版本实现 一.简介 在上一篇文章<庐山真面目之三微服务架构Consul版本实现>中,我们已经探讨了如何搭建基于单节点Consu ...
- 庐山真面目之六微服务架构Consul集群、Ocelot网关集群和Nginx版本实现
庐山真面目之六微服务架构Consul集群.Ocelot网关集群和Nginx版本实现 一.简介 在上一篇文章<庐山真面目之五微服务架构Consul集群.Ocelot网关和Nginx版本实 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- CI Weekly #5 | 微服务架构下的持续部署与交付
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- 互联网保险O2O平台微服务架构设计(转)
非常感谢http://www.cnblogs.com/skyblog/p/5044486.html 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因 ...
随机推荐
- [C#菜鸟]C# Hook (二) 常用钩子的类型
; //监视和记录输入事件.安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录 ; //回放用WH_JOURNALRECORD记录事件 ; //键盘钩子,键盘触发消息.WM_KEYUP或WM ...
- 1.2.1 Maven到底是什么鬼
解释之前,提1个小问题. 1.1.假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟 ...
- 线性回归和正则化(Regularization)
python风控建模实战lendingClub(博主录制,包含大量回归建模脚本和和正则化解释,2K超清分辨率) https://study.163.com/course/courseMain.htm? ...
- 远程连接mysql要点 虚拟主机定义与分类
远程连接mysql:通过主机地址与端口号连接 1. 主机地址:找到主机电脑 2. 端口号:找到对应mysql软件 mysql客户端访问服务端需要进行寻找匹配:连接认证-h 主机地址 例如 -hloca ...
- rocketMQ broker 分发并处理请求
使用 netty 监听端口 // org.apache.rocketmq.remoting.netty.NettyRemotingServer#start ServerBootstrap childH ...
- 二十九:数据库之SQLAlchemy连接数据库
手写SQL复用性不高,SQL越复杂越容易出bug,而且容易引起SQL注入,所以现在Ibanez使用orm框架将数据库映射为数据模型,这是使用SQLAlchemy 准备工作,安装SQLAlchemy和P ...
- robotFramework——FOR循环语句
robotframework支持FOR循环语句,语法和Python的语法基本相同,但robotframework中,“FOR”关键字前面需要增加一个“:”,写成“:FOR”,其它与Python的语法相 ...
- Oracle 归档日志管理
一.Oracle日志介绍 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo log ...
- ABAP的smartform赋值
添加文本后, 在输出选项中指定行/列
- Centos7 安装可视化界面
yum group list Output: Loaded plugins: fastestmirror There is no installed groups file. Maybe run: y ...