第三十二讲:Nginx模块的分类
针对不同的具体场景,nginx模块会细分为子模块;在特定的复杂的场景下这些子模块会新增新的特性和功能;下面我们来看下nginx模块是怎样划分为子模块的;
上一节中我们谈到了ngx_module_t 是每一个模块必须具备的数据结构;其中它有一个成员叫type;这个type其实也就定义了这个模块它是属于哪一种类型的模块;
那么一共有哪些类型的模块尼?
(1):第一类模块叫ngx_core_module 叫核心模块;核心模块里面会有一类核心模块;比如events,http,mail或者stream;它们本身会定义出新的类型模块;所以可以看出来nginx框架代码并没有定义出什么http业务或者stream业务而是通过某一类ngx_core_module它可以独立的去定义出新的子类型模块;我们可以看出nginx的灵活性是非常强的;如果新出了一类应用可以新增一个ngx_core_module来定义新的模块;
(2):还有个独立的模块叫ngx_conf_module,这个类型的模块只有一个模块叫ngx_conf_module;这个模块它只负责去解析我们的nginx.conf文件,非常简单,这里我们不说了;
(3):所有事件处理的方法我们把它内聚为ngx_event_module 事件模块;那么每一类模块中它总是会有一些通用的共性的部分;这类通用共性的部分,我们会在这类模块中其中第一个模块通常加上_core关键字来把通用的模块放到里面;比如event_core,ngx_http_core_module,ngx_mail_core_module,ngx_stream_core_module;那么就像之前所说的每一个core都有一个index;表示它的顺序;所以每一个子类型中所有的事件模块,所有的http模块它们同样是有顺序的;每一个core_module一定是排名在第一位的;因为它定义了所有子类型模块共同具有的一些特性;
(4):再来看最复杂的http模块;ngx_http_core_module它已经定义了许多特色的规则;比如说当一个http请求进入nginx的时候;我们需要为它生成响应;那么为请求生成相应的模块我们叫它请求处理模块;当我们生成响应把响应发送给浏览器的时候我们可能需要对响应中的一些文件做一些特定的处理比如说我发的是一个css文件;那么对这个css文件做一次gzip压缩;那么我们传输的效率将会提升很多,如果我发送的是图片,我需要对图片做裁剪,缩放;那么我用响应过滤模块来处理,响应过滤模块主要对响应做二次处理;还有一类模块叫upsteam相关模块;那么upsteam顾名思义就是我们的上游,就是说当nginx作为反向代理或者说作为正向代理把请求传递给相关的服务做处理的时候 ;那么这类模块都会有upsteam相关的字样;它们专注于在一个请求内部去访问上游服务;其它的mail或者stream相对来说比较简单不再一一细说;
下面我通过之前在编译nginx的时候所看到的源代码文件给大家分析下这些目录是怎样对应到子类型模块中的;
现在我们进入我们nginx的安装目录,在安装目录中我们先看下,有个src目录;之前我们没有详细的介绍src目录;
这里有一个目录名叫core,但是大家不要被它的名字所欺骗;它只是nginx的核心框架代码;并不是指nginx的core_module;
而event,http,或者stream,mail等;这是指所有的子类型的模块都在这里;我们拿最复杂的 http来看:
在http模块中尼,我们还会看到一些框架代码;这类代码尼不算模块;只是辅助于核心流程的的我们不必关心;
但是每一类子模块中都有一个核心模块;它定义了我们http模块的工作方式;它也是放在这个目录下的;比如说ngx_http.c,我们看下这个文件;
我们可以看到在ngx_module_t结构体中;它的type类型为ngx_core_module;它定义了所有的http模块;
所有的框架类的代码,包括nginx的http_core_module都是放在这个目录下的;
而官方提供的非框架的也就是一些可有可无的模块我们把它放到了modules目录下;
可以看到这里有许多模块,我们谈到这些模块分为三类:
(1):处理请求生成响应的模块;不带关键字叫filter和upsteam的;
(2):响应过滤模块,响应过滤的它的所有模块会有一个关键字叫filter;
(3):还有一类与上游服务器发生交互的;upsteam相关模块;带有;upsteam关键字的;它们都是做负载均衡相关的一些工作;