博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx源码剖析--ngx_cycle_s结构体分析
阅读量:4166 次
发布时间:2019-05-26

本文共 2495 字,大约阅读时间需要 8 分钟。

前言

Nginx框架是围绕着ngx_cycle_t结构体运行的。ngx_cycle_t结构体中包含的信息主要可以分为以下部分:

  1. 所有模块的配置信息
  2. 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运行时部分资源的管理。

你可能感兴趣的文章
Intel Optane DC Persistent Memory Module (PMM)详解
查看>>
Ubuntu 18.04安装英特尔Optane DC Persistent Memory Module配置工具ipmctl
查看>>
NUMA架构下的CPU拓扑结构
查看>>
如何判断变量在内存中如何放置的?低位在前还是高位在前
查看>>
c语言中通过指针将数值赋值到制定内存地址
查看>>
64位与32位linux c开发时默认字节对齐值
查看>>
malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)
查看>>
初始化时共享内存的key值和信号量初始化的key值可以一样
查看>>
linux创建线程之pthread_create
查看>>
pthread_attr_init线程通俗举例讲解与线程属性
查看>>
进程和线程的区别
查看>>
int main(int argc,char* argv[])详解,以及与int main()有什么区别
查看>>
SourceInsight全工程查找替换方法
查看>>
C语言chdir()函数:改变当前的工作目录
查看>>
Linux下的函数执行时间的统计方法(测试某个函数的执行时间)
查看>>
调整内核printk的打印级别(启动脚本中运行 echo 0 4 0 7 > /proc/sys/kernel/printk 关闭所有内核打印)
查看>>
临时关闭打开console办法
查看>>
Linux中gmtime和localtime的区别(time_t格式转换为tm格式)
查看>>
如果函数传递的是结构体,小心在调用的参数中给指针重新赋值(拿tm结构体举例)
查看>>
使用nm命令获取linux的可执行文件里或动态库中的所有函数名称
查看>>