nginx源碼學習(三)配置解析

1、以下是我閱讀nginx(1.13.2版本)源碼的一些心得,個人覺得學一個東西最好學它的思想,學會舉一反三。因爲互聯網的東西實在太多 了。
上一章我對nginx ngx_init_cycle做了一個大概的描述,

這一張我對配置文件解析的函數做一下研究。以下是摘自http://tengine.taobao.org/book/chapter_11.html的概念


ngx_init_cycle.h中的調用解析:
 if (ngx_conf_param(&conf) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }


配置解析模塊在ngx_conf_file.c中實現。模塊提供的接口函數主要是ngx_conf_parse,另外,模塊提供一個單獨的接口ngx_conf_param,用來解析命令行傳遞的配置,當然,這個接口也是對ngx_conf_parse的包裝。


鳥瞰nginx解析配置的流程,整個過程可參見下面示意圖:


這是一個遞歸的過程。nginx首先解析core模塊的配置。core模塊提供一些塊指令,這些指令引入其他類型的模塊,nginx遇到這些指令,就重新迭代解析過程,解析其他模塊的配置。這些模塊配置中又有一些塊指令引入新的模塊類型或者指令類型,nginx就會再次迭代,解析這些新的配置類型。比如上圖,nginx遇到“events”指令,就重新調用ngx_conf_parse()解析event模塊配置,解析完以後ngx_conf_parse()返回,nginx繼續解析core模塊指令,直到遇到“http”指令。nginx再次調用ngx_conf_parse()解析http模塊配置的http級指令,當遇到“server”指令時,nginx又一次調用ngx_conf_parse()解析http模塊配置的server級指令。

瞭解了nginx解析配置的流程,我們來看其中的關鍵函數ngx_conf_parse()。

ngx_conf_parse()解析配置分成兩個主要階段,一個是詞法分析,一個是指令解析。

詞法分析通過ngx_conf_read_token()函數完成。指令解析有兩種方式,其一是使用nginx內建的指令解析機制,其二是使用第三方自定義指令解析機制。自定義指令解析可以參見下面的代碼:

if (cf->handler) {
    rv = (*cf->handler)(cf, NULL, cf->handler_conf);
    if (rv == NGX_CONF_OK) {
        continue;
    }

    if (rv == NGX_CONF_ERROR) {
        goto failed;
    }

    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv);

    goto failed;
}

這裏注意cf->handler和cf->handler_conf兩個屬性,其中handler是自定義解析函數指針,handler_conf是conf指針。


因爲我們不對具體實現細節進行探究,解析配置文件具體可以參考文章頭部的鏈接,我個人不做擴展開發,所以也沒去看具體細節。 最後解析的結果就是配置文件中的各個變量都進入了各模塊的屬性中,供各個模塊使用。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章