Nginx架构设计
这里先说下Nginx设计时重视的几个关键点:
- 性能:包括网络性能,单词请求的延迟性,网络效率;(名词就不解释了~)
- 可伸缩性:可通过添加组件来提升服务,或者允许组件之间具有交互功能;
- 简单性:组件的简单程度,便于理解和实现;
- 可修改性:包括可进化性,可扩展性,可定制性,可配置性,可重用性;
- 可见性:可监控关键组件的运行情况;
- 可移植性:跨平台运行;
- 可靠性:在服务出现故障时,一个架构容易受到系统层面故障影响的程度;
模块化设计
高度模块化的设计是Nginx的架构基础。在Nginx中,除了少量的核心代码,其他一切皆为模块。这一点在之前的模块开发的实践中已经感受到了。
所有模块都遵循ngx_module_t的接口设计,并且所有模块间都是分层次、分类别的。
官方Nginx共有五大类型模块:
核心模块、配置模块、事件模块、HTTP模块、mail模块。
它们都各具备相同的ngx_module_t接口,但在请求处理流程中的层次不相同。
Nginx常用模块间的关系如下图:
配置模块与核心模块由Nginx的框架代码定义。其中,配置模块是所有模块的基础,它实现最基本的解析功能(即解析nginx.conf文件)。然后,Nginx框架会调用核心模块,其他三种模块则不会与框架产生直接关系。如上图示,事件模块、HTTP模块、mail模块在核心模块中分别都有一个自己的“代言人”,并在同类模块中有一个作为核心业务与管理功能的模块。比如,事件模块由其代言人ngx_events_module核心模块定义,但所有事件模块加载又由ngx_event_core_module负责。
在上图中,配置模块与核心模块都是与Nginx框架密切相关的,是其他模块的基础。而事件模块又是HTTP模块和mail模块的接触。HTTP模块与mail模块更关注于应用层面,地位相似。
事件驱动架构
事件驱动架构,简单来生活,就是由一些时间发生源产生事件,由一个或多个事件收集器来收集、分发时间,然后许多时间处理器会注册自己感兴趣的事件,同时会“消费”这些事件。
Nginx采用完全的事件驱动架构来处理业务,与传统的Web服务器不同。区别用图示:
两者最重要差别:
传统Web服务器是每个事件消费者独占一个进程资源,Nginx的事件消费者只是被事件分发进程短期调用。
这样的设计使得网络性能、用户感知的请求延时得到提升。但同时带来的一个弊端:每个时间消费者不能有阻塞行为,否则会由于长时间占用分发者进程而导致其他事件得不到响应。更进一步说,就是不能让分发者进程转为休眠或等待状态。