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

nginx 配置文件解析

2010-11-12 17:03 513 查看
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 参数个数一致。配置文件中参数的个数和当前模块的当前指令参数一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: