Nginx配置檔案解析之二

2021-08-26 10:03:26 字數 2761 閱讀 1208

這一部分,我們看看nginx怎樣來組織http block,server block和location location的。

首先設定乙個ngx_http_conf_ctx_t結構,即ctx。

在分析這個結構中成員的作用時,先來看這樣乙個結構:

各個module可以根據需要設定這些函式指標。這些函式有他們各自的用途,create開頭的主要是建立該module需要使用的結構體等等。

再看ngx_http_conf_ctx_t結構,這個結構體中的三個成員都是二級指標。實際上,各個module中create開頭的函式都會建立module的配置結構,將得到的結構指標放到相應的陣列中,如create_main_conf返回的指標會放到ctx->main_conf[i]中,create_srv_conf返回的指標會放到ctx->srv_conf[i]中。當然了這裡會先對所有屬於ngx_http_module的模組進行計數。

接下來,我們會先臨時儲存一下cf,因為在後面的遞迴解析時,cf的一些成員會被更改,而當返回的時候,原來的cf還要繼續用。

pcf = *cf;

cf->ctx = ctx;

我們看這個preconfiguration,即ngx_http_module_t中的第乙個函式指標。它的作用是什麼?

當檢視ngx_modules陣列的時候,會發現下面幾個module設定了preconfiguration:

ngx_http_core_preconfiguration (實際上呼叫了ngx_http_variables_add_core_vars),

說白了,這四個函式主要是在開始後面的解析之前,設定一些變數,來為後用(主要是在指令碼解析編譯的時候)。我們看到的是,他們依次設定了這麼幾個變數(即,全域性陣列):

ngx_http_core_variables,ngx_http_upstream_vars,ngx_http_proxy_vars,ngx_http_browsers。具體內容大家可以自己去讀下**,這些資訊都是後面解析可能會用到的,這也就是preconfiguration中pre字首的意思了!

接下來這兩句告訴我們,下面要解析的內容是只涉及http相關module,而且其配置的指令是直接出現在http block中,而非server或者location,即所謂的main_conf。

當下面這句返回的時候,整個解析就結束了,這也體現了遞迴的特點!

rv = ngx_conf_parse(cf, null);

這裡先進到遞迴過程的內部,出來之後我們再看後面的處理。

進入ngx_conf_parse之後,會遇到「server」,然後會呼叫ngx_http_core_server處理server block的配置。

首先會建立乙個ngx_http_conf_ctx_t結構,我們知道http block中可能會配置多個server,這樣ngx_http_core_server也就被呼叫多次,我們後面會看到這些ngx_http_conf_ctx_t,即ctx,在各層之間建立一系列複雜的關係。

看下面這兩句,server裡面的ctx->main_conf指向http ctx的main_conf,這麼做的原因很簡單,block 的main_conf在各個server公用的,這裡只是繼承上層的main_conf配置。

接下來會出現跟http block處理中相似的一幕,ctx->srv_conf和ctx->loc_conf分別得到了初始化。這裡大家應該意識到location block中肯定也會有相似的一幕,呵呵!

我們看到有這樣的乙個層次:http->server->location,在每個層次的處理時,都會建立乙個ctx(即ngx_http_conf_ctx_t),然後它會繼承上層的配置,只處理屬於自己層次的東西,如location block中的ctx,srv_conf和main_conf都會繼承上層的,而loc_conf則會在當前被設定。

後面會很多次的使用ngx_http_core_module,畢竟接下來的都是http配置的處理。

接下的幾句比較好理解,有幾點需要強調一下。

cscf->ctx = ctx; //這樣在解析server部分的時候,就可以很方便的引用上層和下層的配置。

cmcf->servers; // main_conf中的servers是乙個陣列,httpblock中配置的各個server,都會作為陣列成員放到裡面.

後面的處理跟http block中的類似,進入到server{}的裡面,繼續解析,並將處理location的

配置。在ngx_conf_parse返回之後,若發現沒有配置listen,那麼nginx會這設定預設的。

先說一下,location的解析是整個配置解析裡面最複雜的,下次會單獨展開來講。

nginx系列之二 配置檔案解讀

nginx系列之一 nginx入門 nginx系列之二 配置檔案解讀 nginx系列之三 日誌配置 nginx系列之四 web伺服器 nginx系列之五 負載均衡 nginx系列之六 cache服務 nginx系列之七 限流配置 nginx系列之八 使用upsync模組實現負載均衡 nginx配置檔...

Nginx配置檔案解析

nginx配置檔案解析 nginx配置檔案預設在 usr local nginx conf nginx.conf,配置檔案包括 全域性 event http server設定 event主要設定nginx的工作模式,http提供web功能 server用來設定虛擬主機,server必須位於http內...

nginx配置檔案解析

nginx為微核心加可擴充套件模組。自身模組有core event http mail等核心模組。開發者可以基於這些核心模組開發滿足自身業務需求的模組,主要是http模組。nginx的配置項的資料結構 struct ngx cycle sconf ctx是乙個指標陣列,陣列一共有ngx max mo...