极客专栏《Nginx核心知识100讲》33-34小节的笔记
Nginx的模块究竟是什么?
1.了解Nginx 模块

有的模块编译进去就可以使用。有的模块只有配置了配置项才可以使用。
看源码的方式,看看每个配置项是怎样被提供的。
怎么确定模块确实被编译进去了呢?./configure 完成之后去 objs 目录,该目录下会生成一个ngx_modules.c。里面有个数组 ngx_modules
包含了所有编译进nginx中的模块。
ngx_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
&ngx_regex_module,
&ngx_events_module,
……
}
以gzip为例,我们找下。发现是有的。
# cat ngx_modules.c |grep gzip
extern ngx_module_t ngx_http_gzip_filter_module;
&ngx_http_gzip_filter_module,
"ngx_http_gzip_filter_module"
来看下gzip模块(nginx-1.13.6/src/http/modules
)提供了哪些指令。vim ngx_http_gzip_filter_module.c
。
能看到有这样的结构体ngx_command_t
。这是每个模块必包含的结构体。这个结构体是一个数组。数组中的每个成员都是它所支持的指令名。比如:gzip
( ngx_string("gzip"))、gzip_buffers
。这个指令名后面携带的参数,这个参数什么类型(空间类还是时间类)。可不可以加相关的参数。等等。
static ngx_command_t ngx_http_gzip_filter_commands[] = {
{ ngx_string("gzip"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_gzip_conf_t, enable),
NULL },
{ ngx_string("gzip_buffers"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
ngx_conf_set_bufs_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_gzip_conf_t, bufs),
NULL },
……
}
模块细分的ngx_core_module_t 、ngx_http_module_t、ngx_event_module_t、ngx_mail_conf_ctx_t 都必须遵循与ngx_modue_t同样的规则。
模块的顺序非常重要。 如果两个模块冲突。先生效的模块会阻碍后生效的模块。
nginx 模块首先要高内聚(相应独立的功能是在同一个代码中的)。它的抽象做的是非常好的(commands提供了配置)。启停回调方法在ngx_module_t下面的7个方法。)。如果你想做一些定制化的需求(比如:你想在集群刚启动的时候做一些什么样的事情)那就在回调方法中做。
nginx模块拥有非常好的设计。从第一版本开始没发生过变化。理解nginx模块是理解nginx诸多特性的基础。
Nginx模块的分类
1.分类

ngx_module_t中的type字段,定义了是哪个类型的模块。

ngx_conf_module模块专门解析conf文件。
ngx_core_module 核心模块,会有一类模块events
、http
、stream
。这些模块又定义出新的子类型模块。nginx灵活性比较强,如果新出现一类应用,可以新增一个nginx的core module来定义新的模块。
所有事件处理的通用方法我们内聚为事件模块,即NGX_EVENT_MODULE
,每一类模块中,总会有通用的共性的部分,这类通用的共性部分,会在这个模块中其中第一个模块通常加_core
这样的关键字,把通用的逻辑写在里面(比如:event_core、http中的ngx_http_core_module)。
每个module都有一个index来表示它的顺序。所以每个子类型模块中也有顺序的。每一个core肯定是排第一的,因为它定义了所有子类型模块共同的特性。
2.了解http模块
ngx_http_core_module 定义了许多特殊的规则,比如一个http请求进入nginx的时候,需要生成响应。为请求生成响应的模块叫做请求处理模块。把响应发送给浏览器的时候,如果对响应中的文件做特定处理(比如:发css文件,对css文件做zip压缩,如果是图片,我想裁剪或缩放,我可以用image filter), 响应过滤模块专注于把响应做二次处理。upstream(顾名思义,上游)模块,当nginx做代理(正向或者反向),把请求传递给相关的服务处理的时候,这类模块都会有upstream处理的字样,专注在一个请求的内部访问上游的服务。
- 分析一下这些目录怎样对应到子类型模块中的。
所有子类型的模块都在nginx-1.13.6/src
下(有个目录名叫做core,这个只是nginx核心代码,不要理解位core 模块。)。我们拿http模块分析。
在http文件夹还有一些框架代码,这类代码不算模块,是辅助于核心流程的,不用care。但每一类子模块中,都有一个核心模块,定义了http模块的工作方式(比如:ngx_http.c)。
ngx_http文件中,NGX_CORE_MODULE定义了所有的http模块。
所有的框架代码,包括ngx_http_core_module也是放在http目录下,官方提供非框架类(也就是可有可无)放在了modules文件夹下。里面分三类,一类是处理请求生成响应,一类是响应过滤(关键字filter),还有一类是与上游模块发生交互的(带有upstream,都在做负载均衡等等相关的工作),其他模块都是在做生成响应的。
4.理解模块分类的意义
以后看到新的第三方模块,首先应该看属于哪一类的模块,这一类模块还有一些共通的特性可以帮助我们理解它。
5.Nginx是不支持ftp协议的吧?
作者回复
nginx支持tcp协议,从这个角度上说是支持ftp协议的,因为ftp协议也是跑在tcp协议之上的。即,如果你有多台ftp服务,用nginx做反向代理是合适的。但如果你希望用nginx搭建ftp服务,目前我还没有了解到有这样的nginx模块。
网友评论