nginx学习十二 ngx_cycle_t 和 ngx_init_cycle

本文详细探讨了nginx启动过程中ngx_init_cycle函数的初始化工作,特别是如何处理ngx_cycle_t结构体,包括配置参数、共享内存、监听套接字的设置以及模块初始化。同时分析了ngx_cycle_t在保存启动信息方面的作用。
摘要由CSDN通过智能技术生成

在nginx的启动过程中,ngx_init_cycle这个函数做了大部分的初始化工作,而初始化的变量都保存在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下,并写下来以便以后参考。

1ngx_cycle_t

关于这个结构体前面已经简单介绍过,这里不再赘述。

2ngx_init_cycle

ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle);

先看一下这个old_cycle参数从哪里来的:

   ngx_cycle_t      *cycle, init_cycle;
    init_cycle.pool = ngx_create_pool(1024, log);//创建内存池
    if (init_cycle.pool == NULL) {
        return 1;
    }

    ......
    ......

    if (ngx_process_options(&init_cycle) != NGX_OK) {
        return 1;
    }
	
    cycle = ngx_init_cycle(&init_cycle);

可见在调用ngx_int_cycle之前,这个old_cycle已经保存了一些参数,这些参数包括:prefix,conf_prefix,conf_file, conf_para。主要在ngx_process_options这个函数中初始化old_cycle,这个函数比较简单,看一下代码:

static ngx_int_t
ngx_process_options(ngx_cycle_t *cycle)
{
    u_char  *p;
    size_t   len;

    if (ngx_prefix) {
        len = ngx_strlen(ngx_prefix);
        p = ngx_prefix;

        if (!ngx_path_separator(*p)) {
            p = ngx_pnalloc(cycle->pool, len + 1);
            if (p == NULL) {
                return NGX_ERROR;
            }

            ngx_memcpy(p, ngx_prefix, len);
            p[len++] = '/';
        }

        cycle->conf_prefix.len = len;
        cycle->conf_prefix.data = p;
        cycle->prefix.len = len;
        cycle->prefix.data = p;

    } else {

#ifndef NGX_PREFIX

        p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);
        if (p == NULL) {
            return NGX_ERROR;
        }

        if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {//得到当前的工作目录
            ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");
            return NGX_ERROR;
        }

        len = ngx_strlen(p);

        p[len++] = '/';

        cycle->conf_prefix.len = len;
        cycle->conf_prefix.data = p;//配置目录
        cycle->prefix.len = len;
        cycle->prefix.data = p;//安装目录

#else

#ifdef NGX_CONF_PREFIX
        ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);//配置文件相对于安装的目录
#else
        ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);
#endif
        ngx_str_set(&cycle->prefix, NGX_PREFIX);

#endif
    }

    if (ngx_conf_file) {
        cycle->conf_file.len = ngx_strlen(ngx_conf_file);
        cycle->conf_file.data = ngx_conf_file;

    } else {
        ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);
    }

    if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {
        return NGX_ERROR;
    }

    for (p = cycle->conf_file.data + cycle->conf_file.len - 1;
         p > cycle->conf_file.data;
         p--)
    {
        if (ngx_path_separator(*p)) {
            cycle->conf_prefix.len = p - ngx_cycle->conf_file.data + 1;
            cycle->conf_prefix.data = ngx_cycle->conf_file.data;
            break;
        }
    }

    if (ngx_conf_params) {
        cycle->conf_param.len = ngx_strlen(ngx_conf_params);
        cycle->conf_param.data = ngx_conf_params;
    }

    if (ngx_test_config) {
        cycle->log->log_level = NGX_LOG_INFO;
    }

    return NGX_OK;
}

现在开始进入关键:ngx_init_cycle,按照执行步骤来进行

2.1调用ngx_timezone_update()、ngx_timeofday() 、ngx_time_update(0,0)做时间校准

 ngx_timezone_update();

    /* force localtime update with a new timezone */

    tp = ngx_timeofday();
    tp->sec = 0;

    ngx_time_update();

2.2创建一个新的ngx_cycle_t变量cycle,并且初始化其大部分的成员
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值