您的位置:首页 > 运维架构 > Nginx

nginx之main函数的解读(八)

2014-10-16 16:45 2931 查看
继上次的进度,我们应该看的是ngx_process_options函数了,该函数定义在core文件夹当中的nginx.c文件中

//该函数主要作用是将配置文件的路径,系统运行路径,还有用户输入参数保存在cycle结构体当中
static ngx_int_t
ngx_process_options(ngx_cycle_t *cycle)
{
    u_char  *p;
    size_t   len;

    if (ngx_prefix) {
	    //ngx_prefix是用户指定的nginx系统所在目录名称,接下来是检测该路径是否格式正确,并且将该路径放在conf_prefix和prefix当中
		//-p之后的命令
        len = ngx_strlen(ngx_prefix);
        p = ngx_prefix;
        //ngx_path_separator函数定义在/src/os/unix/ngx_files.h当中,该重定义检测p[len-1]是不是字符'/'		
        if (len && !ngx_path_separator(p[len - 1])) {
		//如果len不是0,而且p[len-1]字符不是'/'
		//   ngx_pnalloc函数定义在/src/core/ngx_palloc.c,返回内存池链中可用数据大小的ngx_pool_t结构体,
            p = ngx_pnalloc(cycle->pool, len + 1);
            if (p == NULL) {
                return NGX_ERROR;
            }
            //同时将前缀放在内存池中
            ngx_memcpy(p, ngx_prefix, len);
            p[len++] = '/';
        }
        //将该前缀放在cycle当中
        cycle->conf_prefix.len = len;
        cycle->conf_prefix.data = p;
        cycle->prefix.len = len;
        cycle->prefix.data = p;

    } else {
        
#ifndef NGX_PREFIX
         //如果用户没有指定nginx路径的话,则查看NGX_PREFIX是否定义了,如果没有定义,则将程序当前运行目录设置成conf_prefix和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++] = '/';
        //如果ngx_prefix是空的,那么我们会将当前目录作为启动项
        cycle->conf_prefix.len = len;
        cycle->conf_prefix.data = p;
        cycle->prefix.len = len;
        cycle->prefix.data = p;

#else

#ifdef NGX_CONF_PREFIX        
		//如果用户既未指定运行目录,但是指定了NGX_CONF_PREFIX的话,也定义了NGX_PREFIX,则将conf_prefix设置成NGX_CONF_PREFIX
        ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);
#else
        //如果用户没有定义NGX_CONF_PREFIX,但是定义了NGX_PREFIX
        ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);
#endif        
        //用户定义了NGX_PREFIX
        ngx_str_set(&cycle->prefix, NGX_PREFIX);

#endif
    }

    if (ngx_conf_file) {
	   //将从用户输入的-c之后的参数中读取到的配置信息保存在cycle->conf_file当中
        cycle->conf_file.len = ngx_strlen(ngx_conf_file);
        cycle->conf_file.data = ngx_conf_file;

    } else {
	    //如果用户没有指定-c参数,也就是没有指定配置文件路径,则需要将系统默认的NGX_CONF_PATH,默认是在ngx_prefix之后的/conf/nginx.conf文件
        ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);
    }
    //ngx_conf_full_name函数是定义在/src/core/ngx_conf_file.c
    if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {
        return NGX_ERROR;
    }
    //执行到此说明cycle->ngx_conf_file已经是绝对路径了
    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) {
	    //如果用户指定了-g参数则将参数保存下来
        cycle->conf_param.len = ngx_strlen(ngx_conf_params);
        cycle->conf_param.data = ngx_conf_params;
    }

    if (ngx_test_config) {
	    //如果用户输入了-t参数,则将cycle->log->log_level设置成NGX_LOG_INFO即可
        cycle->log->log_level = NGX_LOG_INFO;
    }

    return NGX_OK;
}


接下来就是
if (ngx_os_init(log) != NGX_OK) {
        return 1;
    }
明天继续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: