前言
Nginx框架是围绕着ngx_cycle_t结构体运行的。ngx_cycle_t结构体中包含的信息主要可以分为以下部分:
- 所有模块的配置信息
- Nginx运行时所需要的一些资源,包括连接池,内存池,打开文件,操作目录等等
本文将详细介绍ngx_cycle_t结构体所包含的内容。
ngx_cycle_t结构体的内容
struct ngx_cycle_s {
//保存所有模块的配置结构体
void ****conf_ctx;
//内存池
ngx_pool_t *pool;
//日志信息
ngx_log_t *log;
ngx_log_t new_log;
ngx_uint_t log_use_stderr; /* unsigned log_use_stderr:1; */
ngx_connection_t **files;
//连接池
ngx_connection_t *free_connections;
ngx_uint_t free_connection_n;
ngx_queue_t reusable_connections_queue;
//被监听的端口对应的ngx_listen_t数组
ngx_array_t listening;
//操作目录
ngx_array_t paths;
//打开的文件
ngx_list_t open_files;
//共享内存
ngx_list_t shared_memory;
//当前进程中的所有连接对象的总数
ngx_uint_t connection_n;
ngx_uint_t files_n;
//指向当前进程中的所有连接对象
ngx_connection_t *connections;
//当前进程中的所有读写事件,每个读写事件对应一个连接,所
//以读写事件的总数分别都是connection_n
ngx_event_t *read_events;
ngx_event_t *write_events;
ngx_cycle_t *old_cycle;//
//配置文件信息
ngx_str_t conf_file;
ngx_str_t conf_param;
ngx_str_t conf_prefix;
ngx_str_t prefix;
//用于进程间同步的文件锁
ngx_str_t lock_file;
//使用getthehostname得到的主机名
ngx_str_t hostname;
};
关于conf_ctx
这里说明一下里面的conf_ctx数据成员,这是一个多维指针。它主要是保存模块的配置项信息。所谓的模块配置项信息,我们知道nginx是高度模块化的,他的各个功能都由不同的模块构成,这使得系统具有很好的灵活性和可扩展性。在nginx中的配置文件中,会列出很多配置项和配置项对应的配置值,而每个模块都有自己感兴趣的配置项,nginx把一个模块所有感兴趣的配置项放在一个结构体中,称为这个结构体的配置结构体。conf_ctx保存的就是所有模块的配置结构体。,可以看到conf_ctx是void****类型的。因此可以看出,conf_ctx是一个数组,每个数组里面包含一个void***类型的指针,也就是说conf_ctx指向的数组中的每个元素都是一个指针,这个指针再次指向一个指针数组如下图所示
一般来说,level0中的数组中的每个元素指向一个核心模块构建的配置结构体。核心模块构建的结构体功能主要是为了组织管理归属于这个核心模块的同类型模块。但是按这样说的话,所有归属于这个核心模块的同类型模块只需要一个数组就可以了,为什么这里却需要两层的数组,也就是level2到底是做什么用的呢?
这里就要讲到配置文件的格式了,配置文件具有层级嵌套格式,如下以http类型模块为例
http {
server {
location / {
}
location {
}
}
}
在针对该模块的配置文件中,最外层是http层,也成为main层,main块里面有sever块,server块里面可能嵌套location块,而相同的配置项可能在不同的块中都有被设置,也就是说,不同配置块可能会对同一个模块的配置结构体产生影响,于是nginx为了提高配置灵活性,干脆为每个块都创建一个这个配置块可能会影响到的模块的配置结构体,这就解释了level2的作用。详细的细节我们后面介绍模块之间关系和nginx模块组织的时候再仔细说。
除了模块配置结构体信息之外,ngx_cycle_t中还保存一些nginx运行时一些资源信息,这些后面再慢慢讲了。
总结
本篇介绍了ngx_cycle_t,这个nginx围绕运行的结构体。他主要包含了两部分内容:1.模块配置结构体 2.nginx运行时部分资源的管理。