概述
文章目录
- 1. Nginx的模块究竟是什么?
- 2. Nginx模块的分类
1. Nginx的模块究竟是什么?
Nginx之所以能有如此多的特性,是因为有大量的第三方开发者,在为它开发模块,Nginx之所以有这么丰富的生态圈,则是因为它的模块设计非常的优良,就比如TCP协议,它从上个世纪70年代设计至今,没有做过大的变动,接下来我们来看下nginx的模块设计究竟有什么高明之处?
理解Nginx模块,
- (1):首先我们要保证它是编译到我们nginx的
binary
的二进制文件的; - (2):其次我们要了解,这个nginx模块究竟提供了哪些配置项?
- (3):还要了解模块何时被使用?因为有的模块只要编译进nginx就会默认被使用,而有的模块必须使用相应的配置项,必须配置正确时,模块才会被使用;
- (4):这个模块提供了哪些变量?
接下来,我们以实际的场景来给大家演示如何看这四点
我们在官方文档的documentation
中可以看到,所有的官方模块都有完善的说明:
比如,我们在做gzip
压缩的时候,我们可以找到一个叫ngx_http_gzip_module
;
我们打开这个链接可以看到对这个链接的简要描述,以及它所支持的配置,即指令,
比如指令gzip on |off
以及相关描述.
在最下方 ,放了相关的变量;
那么以上四点怎么看尼?我们可以看编译以及源码的方式去看每一个配置项被提供的;
首先我们开始编译时,我们在它的源代码根目录下,会执行./configure --with --without
甚至用--add-module
引入nginx的第三方模块的方式,把我们的nginx编译到nginx中;但我怎么确定它确实编译到我们的nginx中了尼?
我们可以在configure
以后,到objs
目录下,在此目录下会生成一个文件,叫ngx_modules.c
我们可以看到一个数组,叫ngx_modules[]
,这个数组中是包含了所有编译进nginx中中的模块;在这里我们找一找刚才的gzip
输入 /gzip 再按住Enter 可以查询;
(1):我们可以找到这个gzip模块已经被编译到nginx
中了;
(2):我们再看这个gzip模块究竟提供了哪些指令了尼?
我们看到它的源代码中,一个叫command的这样的一个数据结构;
src/http/modules
存放模块的源代码
打开以后在这个源文件中我们搜索ngx_command_t
这样的一个结构体,它是每个模块里面唯一的;
这个结构体是一个数组;数组中的每一个 成员是它所支持的指令名:
每个指令名后面携带的参数表示他可以跟几个参数,这个参数什么样的类型,是空间类的还是时间类的;
这样我们就确定了它支持哪些指令;
所以即使它没有在官方文档中去说明我们也可以看到;
接下来我们再看下nginx模块是如何被定定义的?
ngx_module_t
用来说明每一个模块的结构体,这个结构体中有一个成员叫commands
也就是ngx_command_t
也就是我们刚刚在源代码中看到的ngx_command_t
;而ngx_command_t
这个数组中,每一个元素就是一个指令,以及它所处理的方法以及这些指令可以跟些什么样的参数;ngx_module_t
是通用的模块;但是我们看到,但是我们实际上有许多不同类型的应用;比如HTTP,比如stream
这是完全不同的应用;那么每一类应用都有许多模块组成,所以我们把模块又细分为子模块;ngx_core_module_t
就是核心模块;ngx_http_module_t
就是http模块等,都必须遵循同样的规则;每一类子模块它会重新定义一些新的规则;比如ngx_http_module_t
这个http模块定义了八个回调方法;
而ngx_event_module
事件模块它又定义了事件操作相关的方法;
再回头看ngx_module_t
它会定义所有模块的一个顺序,因为它里面有个index
序号;这个模块的顺序仍然非常重要;它会决定有些模块如果跟其它模块是冲突的话,先生成的模块会阻碍后生成的模块发挥作用,这个我们后面再说,nginx
的模块首先要做到高内聚,也就是说相应独立的功能是在同一个模块代码中的;它的抽象是做的非常好的;比如说我们刚才所说的ngx_module_t
中的command 它就定义了很多配置;它的启停回调方法
有一些定制化的需求,如果希望在集群刚刚启动的时候,做一些什么样的事情,完全可以在这些回调方法中去做,或者说我们找到一些第三方模块;它们就在启停的地方完成了相应的工作;
Nginx模块拥有非常好的设计;nginx模块是我们理解诸多特性的一个基础;
接下来 我们去详细的分析nginx模块中细分了哪些大类的子模块;这些子模块拥有哪些特性;
2. 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目录;
而官方提供的非框架的也就是一些可有可无的模块我们把它放到了modules
目录下;
可以看到这里有许多模块,我们谈到这些模块分为三类:
- (1):处理请求生成响应的模块;不带关键字叫
filter
和upsteam
的; - (2):响应过滤模块,响应过滤的它的所有模块会有一个关键字叫
filter
; - (3):还有一类与上游服务器发生交互的;
upsteam
相关模块;带有;upsteam关键字的;它们都是做负载均衡相关的一些工作;
最后
以上就是清脆火为你收集整理的nginx【21】Nginx的模块的全部内容,希望文章能够帮你解决nginx【21】Nginx的模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复