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 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因 ...
随机推荐
- Note: Time clocks and the ordering of events in a distributed system
http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf 分布式系统的时钟同步是一个非常困难的问题,this ...
- Android 获取视频照片与刷新媒体库
1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...
- Firefox63以后 禁止自动更新方式
参考:https://bbs.kafan.cn/thread-2135160-1-1.html 63版以后在prefs.js文件末尾加代码来禁止自动更新的方式失效 新方式: 使用DisableAppU ...
- leetcode 146LRU cache
class LRUCache { public: LRUCache(int capacity) {_capacity=capacity;} //返回key对应的value int get(int ke ...
- react-native 环境安装常见问题
npm install react-native-cli -g react-native init yourproject npm install react-native run-ios 问题1:卡 ...
- 算法 - DNA搜索 - Ako Corasick
场景:从很长的字符串(输入字符串.DNA)中搜索大量固定字符串(字典.基因) 题目:Determining DNA Health | HackerRank 算法:Aho–Corasick algori ...
- Maven POM 模板[z]
https://juejin.im/post/5cc826a5f265da03a33c443a [z]https://juejin.im/post/5cc826a5f265da03a33c443a S ...
- redis源码分析之数据结构:跳跃表
跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单. 和链表.字典等数据结构被广泛 ...
- MJRefresh实现请求数据列表不满一页,或者请求数据为空时,不显示footer文字
最近自己负责的项目测试要求: 列表的数据不满一页的话就自动隐藏下面的“上拉加载更多”或是“到底了,没有更多数据”. 百度了一下,看了一篇博客的介绍实现: http://blog.csdn.net/gx ...
- CSS3 长度单位
http://www.w3chtml.com/css3/units/length/vh.html https://www.html.cn/book/css/values/length/vh.htm . ...