注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云水居

云在青山水在天,人在江湖不得闲

 
 
 

日志

 
 

nginx的五个模块(1) CONF  

2010-10-20 00:03:41|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

查看全文


Nginx 主要包括五个模块, conf, core, event, http, email
其中conf模块主要用来解析 nginx.conf 配置文件,并设置相关变量。
首先看conf文件的解析时机,从main函数开始解析。
从main到parse_conf
1. 在main函数中调用了 ngx_init_cycle函数,core/nginx.c
main(){
cycle = ngx_init_cycle(&init_cycle);

2. 在ngx_init_cycle函数中调用了ngx_conf_parse函数,core/ngx_cycle.c
ngx_init_cycle(ngx_cycle_t *old_cycle){
 if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {

3. ngx_conf_parse 函数是 nginx.conf 文件解析的主要代码,core/ngx_conf_file.c
ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename){
fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);//打开 nginx.conf 文件
for ( ;; ) {//开始解析
    rc = ngx_conf_read_token(cf);   //读入一个
    rc = ngx_conf_handler(cf, rc);    //解析

配置文件读入与词法
static ngx_int_t
ngx_conf_read_token(ngx_conf_t *cf)
{
    for ( ;; ) {
        if (b->pos >= b->last) { //读到缓存的文件已经解析完,就再文件中读入一段
            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,
                              cf->conf_file->file.offset);
        }
        //分析字符
        if (ch == LF) {           //换行符
            cf->conf_file->line++;
            if (sharp_comment) {
                sharp_comment = 0;
            }
        }
        if (sharp_comment) { //#开头的注释
            continue;
        }
        if (quoted) {                //双引号内
            quoted = 0;
            continue;
        }
        if (need_space) {       //需要空格
            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {
                last_space = 1;
                need_space = 0;
                continue;
            }
            if (ch == ';') {
                return NGX_OK;
            }
            if (ch == '{') {
                return NGX_CONF_BLOCK_START; //Block的开头
            }

配置文件解析与语义
ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last){
    for (i = 0; ngx_modules[i]; i++) {                     //遍历每个模块
        if (ngx_modules[i]->type != NGX_CONF_MODULE
            && ngx_modules[i]->type != cf->module_type)        {   //如果模块不是要求的类型
            continue;
        }
     

查看全文

  评论这张
 
阅读(4146)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017