nginx 配置文件解析

      ngx_conf_parse 这个函数来完成对配置文件的解析,其实这个函数不仅仅解析文件,还可以用来解析参数和块的,不过我们在这里分析解析文件。

 

     文件简单的分为三个部分

     一 配置文件预先处理

     二 读取

     三 处理

 

 

     一  配置文件预处理

     主要打开文件,创建缓冲区,并把文件信息以及读取的缓冲区信息填到cf->conf_file中,这样文件也有了,数据存放地方也准备好了

    fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); if (fd == NGX_INVALID_FILE) { ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, ngx_open_file_n " /"%s/" failed", filename->data); return NGX_CONF_ERROR; } prev = cf->conf_file; cf->conf_file = &conf_file; if (ngx_fd_info(fd, &cf->conf_file->file.info) == -1) { ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno, ngx_fd_info_n " /"%s/" failed", filename->data); } //配置文件中的信息读取到这个缓冲区,分配空间并初始化 cf->conf_file->buffer = &buf; buf.start = ngx_alloc(NGX_CONF_BUFFER, cf->log); if (buf.start == NULL) { goto failed; } buf.pos = buf.start; buf.last = buf.start; buf.end = buf.last + NGX_CONF_BUFFER; buf.temporary = 1; //配置文件相关的信息:打开的文件句柄、文件名字 cf->conf_file->file.fd = fd; cf->conf_file->file.name.len = filename->len; cf->conf_file->file.name.data = filename->data; cf->conf_file->file.offset = 0; cf->conf_file->file.log = cf->log; cf->conf_file->line = 1; type = parse_file;

 

    二  读取文件

    其实这里读取文件和处理指令是读取一条、处理一条的。这个功能是在conf_read_token函数中实现, 读取的时候,先把内容放到缓冲区中,并进行解析,把解析的结果放到了cf->args 里面, 指令的每个单词都在数组中占一个位置,比如 set debug off  ,那么数组中存三个位置。

 

    三  处理指令

    这个功能是在函数ngx_conf_handle中实现的,整个过程中需要遍历所有模块中的所有指令,如果找到一个,就直接调用指令的set 函数,完成对模块的配置信息的设置。 这里主要的过程就是判断是否是找到,需要判断下面一些条件:

 

    a  名字一致。配置文件中指令的名字和模块指令中的名字需要一致

    b  模块类型一致。配置文件指令处理的模块类型和当前模块一致

    c   指令类型一致。 配置文件指令类型和当前模块指令一致

    d  参数个数一致。配置文件中参数的个数和当前模块的当前指令参数一致。

 

你可能感兴趣的:(c,nginx,File,null,buffer,token)