好了,我们继错误信息的初始化之后,继续解读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的参数设置完成,明天继续...