【nginx模块分析】
nginx 模块分析
继承上一篇nginx安装流程,我们已经成功安装好nginx,对于nginx来说,最重要的莫过于是nginx的模块分析,这些就是nginx的模块,当然因为我们只指定了–with-debug,下面的其实也就是nginx的默认模块,然后比较多,没截完,可以自己看一下哈,
模块列表
进入nginx下面的objs目录,文件ngx_modules.c
然后查看模块,如下图所示:
模块结构体
ngx_module_t
从vscode中点击ngx_module_t会发现其实是 ngx_module_s
继续点击ngx_module_s,查看这个结构体。
接下来来分析主要一些结构
ctx_index
index
这两个其实都是模块的标志位,后面用到会说到,至于定义的ngx_uint_t 其实就是nginx定义的类型,如图
*name
其实就是当前模块的名称
*ctx
可以看到类型是任何类型都可以,存放模块的一些基本的信息。
*commands
是当前模块会使用到的一些涉及到的命令,我们先看一下ngx_command_t的结构
ngx_command_t
name
当前命令的名称
type
当前命令的类型。
*(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
当前commad填充配置文件的操作方法,相当于go里面的interface和java里面的抽象类。当说到commad的实现的时候我们会说到
init_master,init_module,init_process等这几个过程,其实后面的成员,(*init_master)(ngx_log_t *log)就是相当于申明了一个名称为init_master,参数为ngx_log_t *log,返回值为ngx_uint_t 的函数,相当于go里面的interface和java里面的抽象类。
init_master
init_master,init_module,init_process等这几个过程,其实后面的成员,(*init_master)(ngx_log_t *log)就是相当于申明了一个名称为init_master,参数为ngx_log_t *log,返回值为ngx_uint_t 的函数,相当于go里面的interface和java里面的抽象类。这个我们会结合具体的模块分析,并且在用到的时候具体问题具体分析。
至于后面的spark_hook0-spark_hook7,看一下作用不大,后面如果有,我们在这边加上
接下来我们用第一个模块也是核心的模块去做示例,也就是ngx_core_module
模块实例
ngx_core_module
首先我们来看定义
首先我们来看一下第一项也就是NGX_MODULE_V1
可以看到
NGX_MODULE_V1 后面是跟随了7项,正好每个对应了ngx_module_s 中国的前面七个,分别是ctx_index到*signature,第一个NGX_MODULE_UNSET_INDEX ,定义的类型是(ngx_uint_t) -1
而ngx_uint_t 就是 unsigned long ,所以差不多就是当前系统最大的数字了。其他的都比较简单了,就不细说了,感兴趣的可以自己点击跳转看一下哈,
ngx_core_module_ctx
这个是对应着ngx_module_s 中的*ctx,类型是void,接下来看看ngx_core_module_ctx的这个结构,这个结构
这个static的这个修饰,其实代表的是局部,别的文件将会无法引入。
接下来再看看ngx_core_module_t这个结构体。
其实也是比较的简单,其实就是名称,然后接下来的变量从字面意思上面理解就是创建配置文件和初始化配置文件,当然具体作用我们后面再说,
ngx_core_commands
接下来我们点进去看一下长什么样子,这个是一个ngx_command_t的一个结构体数组,至于ngx_command_t上面说了哈。
再看看我们此时的配置文件,也就是我们nginx启动时候读取的文件,cat /usr/local/nginx/conf/nginx.conf
仔细看是不是配置文件中的user,worker_process在ngx_core_commands中是可以找到对应的存在。
而对于在ngx_conf_set_flag_slot,ngx_conf_set_msec_slot其实就是读取到配置后对于配置文件也就是ngx_conf_t的一些操作.
ngx_errlog_module
这个模块是ngx的errorllog模块,老样子,我们还是来看一下相应的结构
和ngx_core_module 对比是不是很像,这里就不细说了,有兴趣的小伙伴可以自己去看一下,其实主体方法都一样,包括下面的模块,后面用到了这些模块我们会一一细说的。
接下来我们开始分析nginx的流程。详见nginx流程分析