ngx_event_get_conf

本文详细解释了ngx_event_get_conf宏的定义和用途,阐述了conf_ctx数据结构以及module数据类型在nginx配置过程中的角色。重点讨论了如何通过传入module参数获取对应模块的配置信息,以及conf_ctx数据结构各部分的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ngx_event_get_conf的定义如下:

#define ngx_event_get_conf(conf_ctx, module)                                  \
             (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];


对于这个宏的引用,conf_ctx的数据类型如下:
struct ngx_cycle_s {
    /* 保存着所有模块存储配置项的结构体指针,它首先是一个数组,每个数组成员又是一个指针,
    这个指针指向另一个存储着指针的数组,因此会看到void ****
    */
    void                  ****conf_ctx
    // 内存池
    ngx_pool_t               *pool;     


    /*
    日志模块中提供了生成基本ngx_log_t日志对象的功能,这里的log实际上是在还没有执行ngx_init_cycle方法前,
    也就是还没有解析配置前,如果有信息需要输出到日志,就会暂时使用log对象,它会输出到屏幕。
    在ngx_init_cycle方法执行后,将会根据nginx.conf配置文件中的配置项,构造出正确的日志文件,此时会对log重新赋值。
    */
    ngx_log_t                *log;      
    /*
    由nginx.conf配置文件读取到日志文件路径后,将开始初始化error_log日志文件,由于log对象还在用于输出日志到屏幕,
    这时会用new_log对象暂时性地替代log日志,待初始化成功后,会用new_log的地址覆盖上面的log指针
    */
    ngx_log_t                 new_log; 


    /*
    对于poll,rtsig这样的时间模块,会以有效文件句柄数来预先建立这些ngx_connection_t结构体,
    以加速事件的收集,分发。这时files就会保存所有ngx_connection_t的指针组成的数组,
    files_n就是指针的总数,而文件句柄的值用来访问files数组成员
    */
    ngx_connection_t        **files;    


    // 可用连接池,与free_connection_n配合使用
    ngx_connection_t         *free_connections;
    // 可用连接池中连接的总数    
    ngx_uint_t                free_connection_n;    


    /* 双向链表容器,元素类型是ngx_connection_t结构体,表示可重复使用连接队列 */
    ngx_queue_t               reusable_connections_queue;  


    // 动态数组,每个数组元素储存着ngx_listening_t成员,表示监听端口及相关的参数
    ngx_array_t               listening;        


    /*
    动态数组容器,它保存着nginx所有要操作的目录。如果有目录不存在,就会试图创建,而创建目录失败就会导致nginx启动失败。
    */
    ngx_array_t               pathes;           
    /*
    单链表容器,元素类型是ngx_open_file_t 结构体,它表示nginx已经打开的所有文件。事实上,nginx框架不会向open_files链表中添加文件。
    而是由对此感兴趣的模块向其中添加文件路径名,nginx框架会在ngx_init_cycle 方法中打开这些文件
    */
    ngx_list_t                open_files;       


    // 单链表容器,元素类型是ngx_shm_zone_t结构体,每个元素表示一块共享内存
    ngx_list_t                shared_memory;   


    // 当前进程中所有链接对象的总数,与connections成员配合使用
    ngx_uint_t                connection_n;    
    ngx_uint_t                files_n;     


    // 指向当前进程中的所有连接对象,与connection_n配合使用
    ngx_connection_t         *connections;   
    // 指向当前进程中的所有读事件对象,connection_n同时表示所有读事件的总数
    ngx_event_t              *read_events;   
    // 指向当前进程中的所有写事件对象,connection_n同时表示所有写事件的总数
    ngx_event_t              *write_events;  


    /*
    旧的ngx_cycle_t 对象用于引用上一个ngx_cycle_t 对象中的成员。例如ngx_init_cycle 方法,在启动初期, 
    需要建立一个临时的ngx_cycle_t对象保存一些变量,再调用ngx_init_cycle 方法时就可以把旧的ngx_cycle_t 对象传进去,
    而这时old_cycle对象就会保存这个前期的ngx_cycle_t对象。
    */
    ngx_cycle_t              *old_cycle;    


    // 配置文件相对于安装目录的路径名称
    ngx_str_t                 conf_file;
    // nginx 处理配置文件时需要特殊处理的在命令行携带的参数,一般是-g 选项携带的参数     
    ngx_str_t                 conf_param;      
    // nginx配置文件所在目录的路径
    ngx_str_t                 conf_prefix;
    //nginx安装目录的路径    
    ngx_str_t                 prefix;
    // 用于进程间同步的文件锁名称         
    ngx_str_t                 lock_file;
    // 使用gethostname系统调用得到的主机名      
    ngx_str_t                 hostname;   
};

module的数据类型如下:

struct ngx_module_s {
    //对于一类模块(由下面的type成员决定类别)而言,ctx_index标示当前模块在这类模块中的序号。
    //这个成员常常是由管理这类模块的一个nginx核心模块设置的,对于所有的HTTP模块而言,ctx_index
    //是由核心模块ngx_http_module设置的。
    ngx_uint_t            ctx_index;


    //index表示当前模块在ngx_modules数组中的序号。Nginx启动的时候会根据ngx_modules数组设置各个模块的index值
    ngx_uint_t            index; 


    //spare系列的保留变量,暂未使用
    ngx_uint_t            spare0;
    ngx_uint_t            spare1;
    ngx_uint_t            spare2;
    ngx_uint_t            spare3;


    //nginx模块版本,目前只有一种,暂定为1
    ngx_uint_t            version;


    //模块上下文,每个模块有不同模块上下文,每个模块都有自己的特性,而ctx会指向特定类型模块的公共接口。
    //比如,在HTTP模块中,ctx需要指向ngx_http_module_t结构体。
    void                 *ctx;


    //模块命令集,将处理nginx.conf中的配置项
    ngx_command_t        *commands;


    //标示该模块的类型,和ctx是紧密相关的。它的取值范围是以下几种:
    //NGX_HTTP_MODULE,NGX_CORE_MODULE,NGX_CONF_MODULE,
    //NGX_EVENT_MODULE,NGX_MAIL_MODULE
    ngx_uint_t            type;


    //下面7个函数是nginx在启动,停止过程中的7个执行点
    ngx_int_t           (*init_master)(ngx_log_t *log);         //初始化master
    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);     //初始化模块
    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);    //初始化进程
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);     //初始化线程
    void                (*exit_thread)(ngx_cycle_t *cycle);     //退出线程
    void                (*exit_process)(ngx_cycle_t *cycle);    //退出进程
    void                (*exit_master)(ngx_cycle_t *cycle);     //退出master


    //保留字段,无用,可以使用NGX_MODULE_V1_PADDING来替换
    uintptr_t             spare_hook0;
    uintptr_t             spare_hook1;
    uintptr_t             spare_hook2;
    uintptr_t             spare_hook3;
    uintptr_t             spare_hook4;
    uintptr_t             spare_hook5;
    uintptr_t             spare_hook6;
    uintptr_t             spare_hook7;
};

conf_ctx是各个模块的配置指针(三级指针).通过传入的module参数作为索引,从而取得对应的配置信息.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值