nginx源码分析(1)——启动过程

本文主要探讨了nginx的启动过程,包括关键的数据结构及其在启动阶段的作用,详细分析了从main函数开始,经过ngx_init_cycle函数,再到再次调用main函数的整个流程。
摘要由CSDN通过智能技术生成

1. 重要的数据结构

        1. ngx_module_t
        nginx中所有模块的类型都是ngx_module_t类型的,定义了模块的一些属性。nginx是完全模块化的,所有的组件都是模块,从而实现了nginx的高度松耦合。同时,我们在进行nginx模块开发时,也离不开这个数据结构。
struct ngx_module_s {
    /**
     * 在具体类型模块(http、event等)的全局配置结构数组的下标。以http module模块为例,
     * nginx把所有的http module的config信息存放在ngx_http_conf_ctx_t类型的变量中,
     * 这个变量只有3个属性,分别是所有http module的main、srv、loc的config信息的数组。
     * 如果该模块是http module,则ctx_index是该模块的config信息(main、srv、loc)
     * 在ngx_http_conf_ctx_t中的下标。
     */
    ngx_uint_t            ctx_index;

    /**
     * nginx把所有模块(ngx_module_t)存放到ngx_modules数组中,这个数组在nginx源码路
     * 径的objs/ngx_modules.c中,是在运行configure脚本后生成的。index属性就是该模块
     * 在ngx_modules数组中的下标。同时nginx把所有的core module的配置结构存放到ngx_cycle的
     * conf_ctx数组中,index也是该模块的配置结构在ngx_cycle->conf_ctx数组中的下标。
     */
    ngx_uint_t            index;

    ……

    /**
     * 模块的上下文属性,同一类型的模块的属性是相同的,比如core module的ctx是ngx_core_module_t类型。
     * 而http module的ctx是ngx_http_moduel_t类型,event module的ctx是ngx_event_module_t类型等等。
     * 相应类型的模块由分开处理的,比如所有的http module由ngx_http_module解析处理,而所有的event module
     * 由ngx_events_module解析处理。
     */
    void                 *ctx;

    /**
     * 该模块支持的指令的数组,最后以一个空指令结尾。ngx_commond_t的分析见下文。
     */
    ngx_command_t        *commands;

    /**
     * 模块的类型,nginx所有的模块类型:
     * 		NGX_CORE_MODULE
     * 		NGX_CONF_MODULE
     * 		NGX_HTTP_MODULE
     * 		NGX_EVENT_MODULE
     * 		NGX_MAIL_MODULE
     * 这些不同的类型也指定了不同的ctx。
     */
    ngx_uint_t            type;

    /* 接下来都是一些回调函数,在nginx初始化过程的特定时间点调用 */
    ngx_int_t           (*init_master)(ngx_log_t *log);

    /* 初始化完所有模块后调用,在ngx_int_cycle函数(ngx_cycle.c)中 */
    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);

    /* 初始化完worker进程后调用,在ngx_worker_process_init函数(ngx_process_cycle.c)中 */
    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);
    ……
};
        下面的表格是type与ctx的对应关系:
模块类型(type) 上下文属性类型(ctx)
NGX_CORE_MODULE
ngx_core_module_t(ngx_conf_file.h)
NGX_CONF_MODULE
NULL
NGX_HTTP_MODULE
ngx_http_module_t(http/ngx_http_config.h)
NGX_EVENT_MODULE
ngx_event_module_t(event/ngx_event.h)
NGX_MAIL_MODULE
ngx_mail_module_t(mail/ngx_mail.h)

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值