這是一個遞歸的過程。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; }