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

nginx之main函数的解读(四)

2014-10-12 11:03 3039 查看
好了,我们继错误信息的初始化之后,继续解读main函数,它接下来的操作是这样的

if (ngx_get_options(argc, argv) != NGX_OK) {
        return 1;
    }

而ngx_get_options函数是这样的:

static ngx_int_t
ngx_get_options(int argc, char *const *argv)
{
    u_char     *p;
    ngx_int_t   i;

    for (i = 1; i < argc; i++) {
        p = (u_char *) argv[i];
         //这要说明第一个参数之前应该有-的标记,如果没有则不是正规的参数说明,即报错
        if (*p++ != '-') 
           {
             ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);
             return NGX_ERROR; 
           }

        //开始从-之后的第一个字符开始读取

		while (*p)
		{ 
		//接下来就是获取参数是 
		switch (*p++) {
            //这里面自然就是版本信息了,是否显示版本信息,同时读取到该参数之后停止读取后面的参数,如果是?或者h则显示版本信息和帮助信息(-? -h)
                case '?': 
		case 'h': 
		        ngx_show_version = 1;
            	ngx_show_help = 1; 
				break; 
		//这里面显示的是版本号(-v),停止读取后续信息 
		case 'v': 
		     ngx_show_version = 1; 
			 break;
		//这里面显示的版本号和配置信息(-V),停止读取后续信息
		case 'V': 
			ngx_show_version = 1; 
			ngx_show_configure = 1; 
			break;
		//运行测试配置信息,停止读取后续信息
		case 't': 
			ngx_test_config = 1; 
			break;
		//停止运行nginx,同时,停止读取后续信息
		case 'q': 
			ngx_quiet_mode = 1; 
			break;
		/*一般我们知道,如果是p开始的,那么他的配置信息应该是如下例程的:--prefix=/usr/local/nginx --add-module=/home/yefeng/ngxdev/ngx_http_echo
		也就是说以p开始的字符串是prefix=/usr/local/nginx 就将ngx_prefix置成了prefix=/usr/local/nginx,如果仅仅是 -p 那么我们就将目光转向-p 后面的字
		符串,或者说配置信息,也就是--add-module=/home/yefeng/ngxdev/ngx_http_echo,将这个信息赋给ngx_prefix即可,不出错,则继续循环*/
		case 'p': 
			if (*p) 
			{ 
				ngx_prefix = p; 
				goto next; 
			} 
			if (argv[++i]) 
			{ 
				// ngx_prefix当前的参数信息 
				ngx_prefix = (u_char *) argv[i]; 
				goto next;
			} 
			//记录下 错误的信息 
			ngx_log_stderr(0, "option \"-p\" requires directory name"); 
			return NGX_ERROR;
		//寻找配置信息所在的位置,没有则获取默认位置的配置文件,不出错,则继续读取(-cngxin.conf 或者-c nginx.conf)
		case 'c': 
			if (*p) 
			{ 
				//c 表明的是配置文件所在 
				ngx_conf_file = p; 
				goto next;
			} 
			if (argv[++i]) 
			{ 
				//下一个可能就是了,针对不同的输入格式 
				ngx_conf_file = (u_char *) argv[i]; 
				goto next; 
			} 
			ngx_log_stderr(0, "option \"-c\" requires file name"); 
			return NGX_ERROR; 
			//获取配置参数,同时也是两种方式-gparam 或者 -g param,不出错,则继续循环 
			case 'g': 
				if (*p) 
				{ 
				// g 表明的是配置参数 
					ngx_conf_params = p; 
					goto next; 
				} 
				if (argv[++i]) 
				{
					//可能输入参数格式有些问题 
					ngx_conf_params = (u_char *) argv[i]; 
					goto next; 
				} 
				ngx_log_stderr(0, "option \"-g\" requires parameter"); 
				return NGX_ERROR; 
				//读取信号处理,退出,重启,等等操作,如果参数正确,则继续循环,不正确,则退出-squit 或者-s quit 
			case 's': 
				if (*p) 
				{
					// s说明要输入的是信号,同时读取,我们知道信号 只有 stop quit reopen reload只有几个,其他的都不对 
					ngx_signal = (char *) p; 
				} 
				else if (argv[++i]) 
				{ 
					ngx_signal = argv[i];
				} 
				else 
				{ 
					ngx_log_stderr(0, "option \"-s\" requires parameter"); 
					return NGX_ERROR; 
				} 
				if (ngx_strcmp(ngx_signal, "stop") == 0 || ngx_strcmp(ngx_signal, "quit") == 0 || ngx_strcmp(ngx_signal, "reopen") == 0 || ngx_strcmp(ngx_signal, "reload") == 0) 
				{ 
					ngx_process = NGX_PROCESS_SIGNALLER; 
					goto next; 
				} 
				ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal); return NGX_ERROR; 
				//除了上述参数以外不接受其他,如果有了,则进行错误处理,启动失败 
				default: ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1)); 
				return NGX_ERROR; 
			} 
		} 
		next: continue; 
		}
	return NGX_OK;
}


而该函数的定义就在core文件夹下面的nginx.c文件当中,ngx_get_option函数主要作用是可以读入用户在启动nginx现在说下笔者感觉比较疑惑的几个参数

第一个是ngx_prefix,该参数是在ngx_process_options(该函数也是在nginx.c文件当中)中使用的,如果用户不指定该参数,则使用程序所在当前目录,作为默认的目录,其实 也就说说运行目录,如果在configure中,应该指定的就是安装目录了,如果指定的话,当然就是用指定目录了,以后的操作都是在该目录下进行的,同时该ngx_prefix要记录在ngx_cycle_t的conf_prefix当中的。

第二个是ngx_conf_file参数,如果制定了-c就是说指定了ngx_conf_file参数的话,我们就得将该信息放在ngx_cycle_t当中的conf_file当中,如果是没有指定参数的话那么。就默认使用

NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}


如果而NGX_CONF_PATH,也就是nginx的安装目录下的conf文件夹下的nginx.conf文件

第三个就是ngx_conf_params 也就是-g参数,如果指定了ngx_conf_param参数,那么就需要记录该参数,在ngx_cycle_t的conf_param的参数里面

第四个就是ngx_test_config也就是 -t参数,如果指定了,那么就将nginx的日志记录登记设置成NGX_LOG_INFO。即(cycle->log->log_level=NGX_LOG_INFO)

以上几个操作都是在ngx_process_options函数中执行的。

至此,nginx的参数设置完成,明天继续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: