真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在nginx中使用http模塊-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)如何在nginx中使用http模塊,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、金山網(wǎng)絡(luò)推廣、小程序開(kāi)發(fā)、金山網(wǎng)絡(luò)營(yíng)銷、金山企業(yè)策劃、金山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供金山建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

1. 核心模塊的存儲(chǔ)方式

在nginx運(yùn)行過(guò)程中,有一個(gè)全局配置結(jié)構(gòu)體 ngx_cycle_t ,其有一個(gè)屬性 conf_ctx ,這個(gè)屬性是存儲(chǔ)nginx所有模塊配置的一個(gè)數(shù)組,這個(gè)數(shù)組的長(zhǎng)度與nginx模塊的個(gè)數(shù)相同。不過(guò)需要注意的是, conf_ctx 數(shù)組的第一維只會(huì)存儲(chǔ)核心模塊的配置,而其他模塊對(duì)應(yīng)的位置處的數(shù)組元素其實(shí)是為NULL。在 conf_ctx 中,各個(gè)核心模塊配置結(jié)構(gòu)體的存儲(chǔ)位置與該模塊在所有模塊(包括非核心模塊)中的相對(duì)位置是一致的,如下圖所示為nginx存儲(chǔ)核心模塊的一個(gè)結(jié)構(gòu)示意圖:

如何在nginx中使用http模塊

這里標(biāo)注的 eventshttp 只是為了展示方便而添加的,本質(zhì)上這個(gè)數(shù)組的元素的類型是 void* 的指針,至于該指針指向的具體結(jié)構(gòu)體的類型,則是根據(jù)各個(gè)核心模塊自身的定義來(lái)的。

在http模塊下,其指向了一個(gè) ngx_http_conf_ctx_t 類型的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體的作用就是用來(lái)存儲(chǔ)http配置塊中各個(gè)配置項(xiàng)的數(shù)據(jù)的。如下是這個(gè)結(jié)構(gòu)體的定義:

typedef struct {
 	// 存儲(chǔ)MAIN級(jí)別配置
  void **main_conf;
 	// 存儲(chǔ)SRV級(jí)別配置
  void **srv_conf;
 	// 存儲(chǔ)LOC級(jí)別配置
  void **loc_conf;
} ngx_http_conf_ctx_t;

我們知道,在nginx.conf配置文件中,在http塊下還配置有server塊,而server塊下也是可以有l(wèi)ocation塊,更有甚者,在location塊下可以有子location塊,如此往復(fù),而這里的 ngx_http_conf_ctx_t 結(jié)構(gòu)體的作用就是存儲(chǔ)所有的這些配置所對(duì)應(yīng)的結(jié)構(gòu)體數(shù)據(jù)。首先,我們需要明確的一點(diǎn)是,在nginx.conf配置文件中,配置項(xiàng)都是由一個(gè)個(gè)模塊定義的,一個(gè)模塊可以定義多個(gè)配置項(xiàng),對(duì)于這些配置項(xiàng)的解析工作都是由這個(gè)模塊所定義的方法進(jìn)行的。但是,一般的,一個(gè)模塊一般都只會(huì)定義一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體中的各個(gè)屬性則對(duì)應(yīng)于該模塊所定義的各個(gè)配置項(xiàng)的數(shù)據(jù),也就是說(shuō),通過(guò)各個(gè)模塊所定義的方法,其會(huì)將其所定義的配置項(xiàng)對(duì)應(yīng)的配置轉(zhuǎn)換為該模塊所定義的結(jié)構(gòu)體。這里所說(shuō)的結(jié)構(gòu)體就對(duì)應(yīng)于上面的 main_conf 、 srv_confloc_conf 中的配置。從上面的定義就可以看出,這三個(gè)屬性的類型都是指針類型的數(shù)組,而數(shù)組的長(zhǎng)度就對(duì)應(yīng)于模塊的個(gè)數(shù),準(zhǔn)確來(lái)講,是對(duì)應(yīng)于http模塊的各個(gè)。在解析各個(gè)http模塊的配置之前,nginx會(huì)對(duì)各個(gè)http模塊在當(dāng)前類型的模塊(http模塊)中進(jìn)行相對(duì)位置進(jìn)行標(biāo)記,每個(gè)http模塊的相對(duì)位置就對(duì)應(yīng)于上面的三個(gè)屬性的數(shù)組下標(biāo)。前面已經(jīng)講到,每個(gè)http模塊都只會(huì)有一個(gè)配置結(jié)構(gòu)體存儲(chǔ)該模塊所定義的所有配置數(shù)據(jù),而這些配置結(jié)構(gòu)體就是存儲(chǔ)在上面的三個(gè)數(shù)組中的。這樣,我們就能夠理解了,其實(shí)上面的結(jié)構(gòu)體的三個(gè)屬性,每一個(gè)屬性的數(shù)組都對(duì)應(yīng)了一個(gè)http模塊的配置結(jié)構(gòu)體。

既然這里每個(gè)模塊都有一個(gè)結(jié)構(gòu)體存儲(chǔ)在數(shù)組的對(duì)應(yīng)索引位置,那這里為什么需要三個(gè)數(shù)組呢?比如說(shuō),對(duì)于 ngx_http_core_module ,其相對(duì)位置在http模塊是第一個(gè),也就是說(shuō) main_conf[0] 、 srv_conf[0]loc_conf[0] 存儲(chǔ)的都是 ngx_http_core_module 的配置結(jié)構(gòu)體,為什么需要三個(gè)結(jié)構(gòu)體。這里我們需要說(shuō)明的是,對(duì)于每個(gè)http模塊,其會(huì)根據(jù)需要將配置項(xiàng)按照可使用范圍劃分為三類:僅用于http塊,可以用于http塊和server塊,以及可以用于http塊、server塊和location塊。每一類配置項(xiàng)都使用的是一個(gè)不同的結(jié)構(gòu)體,比如 ngx_http_core_module 就定義了 ngx_http_core_main_conf_t 用于存儲(chǔ)僅用于http塊的配置項(xiàng),定義了 ngx_http_core_srv_conf_t 用于存儲(chǔ)用于http塊和server塊的配置項(xiàng),定義了 ngx_http_core_loc_conf_t 用于存儲(chǔ)用于http塊、server塊和location塊的配置項(xiàng)。對(duì)應(yīng)于上面的數(shù)組就是, main_conf[0] 的結(jié)構(gòu)體類型為 ngx_http_core_main_conf_t , srv_conf[0] 的結(jié)構(gòu)體類型為 ngx_http_core_srv_conf_t , loc_conf[0] 對(duì)應(yīng)的結(jié)構(gòu)體類型為 ngx_http_core_loc_conf_t 。說(shuō)到這里,我們就必須要厘清一個(gè)問(wèn)題了,比如,對(duì)于某個(gè)配置項(xiàng),其配置在了http塊中,但是其類型是可以用于http塊、server塊和location塊的,那么其就會(huì)被存儲(chǔ)在 loc_conf[0] 中,也就是說(shuō),上面的一整個(gè)結(jié)構(gòu)體,從目前來(lái)看,存儲(chǔ)的都是在http塊中解析出來(lái)的各個(gè)配置項(xiàng)的數(shù)據(jù)。那么nginx是如何標(biāo)記一個(gè)配置項(xiàng)是這三種類型中的哪一種呢?這主要是通過(guò) ngx_command_t 結(jié)構(gòu)體來(lái)定義的,如下所示為三個(gè)典型的配置:

{
 ngx_string("variables_hash_max_size"),
 NGX_HTTP_MAIN_CONF | NGX_CONF_TAKE1,
 ngx_conf_set_num_slot,
 	NGX_HTTP_MAIN_CONF_OFFSET,
 	offsetof(ngx_http_core_main_conf_t, variables_hash_max_size),
 	NULL
},
{
 ngx_string("listen"),
 	NGX_HTTP_SRV_CONF | NGX_CONF_1MORE,
 	ngx_http_core_listen,
 	NGX_HTTP_SRV_CONF_OFFSET,
 	0,
 	NULL
},
{
 ngx_string("root"),
 	NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF
 	 | NGX_CONF_TAKE1,
 	ngx_http_core_root,
 	NGX_HTTP_LOC_CONF_OFFSET,
 	0,
 	NULL
},

這里我們以 variables_hash_max_sizelistenroot 三個(gè)指令為例,這三個(gè)指令都是 ngx_http_core_module 模塊定義的配置項(xiàng),但是它們存儲(chǔ)的位置則是完全不同的。我們需要注意的就是每個(gè)指令的第四個(gè)屬性的定義: NGX_HTTP_MAIN_CONF_OFFSET 、 NGX_HTTP_SRV_CONF_OFFSETNGX_HTTP_LOC_CONF_OFFSET 。這三個(gè)類型的定義有兩重含義,一個(gè)是表示這個(gè)配置項(xiàng)是僅用于http塊,還是可以用于http塊和server塊,再或者是可以用于http塊、server塊和location塊;另一重含義是定義了這個(gè)配置項(xiàng)在上面講的 ngx_http_conf_ctx_t 中的偏移量,所謂的偏移量指的就是,在知道 ngx_http_conf_ctx_t 結(jié)構(gòu)體對(duì)象的指針地址時(shí),通過(guò)這里的偏移量就可以計(jì)算出當(dāng)前配置項(xiàng)所存儲(chǔ)的數(shù)組。這里我們就需要展示一段代碼,即在 ngx_conf_parse() 方法中,其主要是用于解析nginx.conf配置文件的,在解析了某個(gè)配置項(xiàng)之后,就會(huì)在所有的模塊中,找到該配置項(xiàng)的定義,如果找到了配置項(xiàng),就會(huì)嘗試獲取存儲(chǔ)該配置項(xiàng)所對(duì)應(yīng)的結(jié)構(gòu)體,并且會(huì)調(diào)用該配置項(xiàng)指定的方法進(jìn)行配置項(xiàng)數(shù)據(jù)的解析。這里嘗試獲取該配置項(xiàng)所對(duì)應(yīng)的結(jié)構(gòu)體時(shí),就需要用上上面的偏移量。如下是獲取該配置項(xiàng)的方法:

// 查找配置對(duì)象,NGX_DIRECT_CONF常量單純用來(lái)指定配置存儲(chǔ)區(qū)的尋址方法,只用于core模塊
if (cmd->type & NGX_DIRECT_CONF) {
 conf = ((void **) cf->ctx)[cf->cycle->modules[i]->index];

 // NGX_MAIN_CONF常量有兩重含義,其一是指定指令的使用上下文是main(其實(shí)還是指core模塊),
 // 其二是指定配置存儲(chǔ)區(qū)的尋址方法。
} else if (cmd->type & NGX_MAIN_CONF) {
 conf = &(((void **) cf->ctx)[cf->cycle->modules[i]->index]);

 // 除開(kāi)core模塊,其他類型的模塊都會(huì)使用第三種配置尋址方式,也就是根據(jù)cmd->conf的值
 // 從cf->ctx中取出對(duì)應(yīng)的配置。舉http模塊為例,cf->conf的可選值是NGX_HTTP_MAIN_CONF_OFFSET、
 // NGX_HTTP_SRV_CONF_OFFSET、NGX_HTTP_LOC_CONF_OFFSET,
 // 分別對(duì)應(yīng)“http{}”、“server{}”、“l(fā)ocation{}”這三個(gè)http配置級(jí)別。

 // 這個(gè)if判斷的作用主要是,cf->ctx的類型是ngx_http_conf_ctx_t,而cmd->conf主要的值可選
 // NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET、NGX_HTTP_LOC_CONF_OFFSET,
 // 可以看到ngx_http_conf_ctx_t的屬性有main_conf、srv_conf和loc_conf,
 // 其實(shí)這里就是在計(jì)算當(dāng)前的配置對(duì)象是存儲(chǔ)在這三個(gè)數(shù)組中的哪一個(gè)數(shù)組中,以default_type指令為例,
 // 其ngx_command_t的配置為:
 // {ngx_string("default_type"),
 //   NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
 //   ngx_conf_set_str_slot,
 //   NGX_HTTP_LOC_CONF_OFFSET,
 //   offsetof(ngx_http_core_loc_conf_t, default_type),
 //   NULL},
 // 可以看到,其conf屬性的值為NGX_HTTP_LOC_CONF_OFFSET,則說(shuō)明其是存儲(chǔ)在loc_conf數(shù)組中的,
 // 而該數(shù)組中的元素類型為ngx_http_core_loc_conf_t,因而可以看到,后面ngx_command_t
 // 中offset屬性的值就指定為了offsetof(ngx_http_core_loc_conf_t, default_type),
 // 這就是在計(jì)算default_type屬性在ngx_http_core_loc_conf_t結(jié)構(gòu)體中的位置。
 // 通過(guò)下面的if判斷第一步confp = *(void **) ((char *) cf->ctx + cmd->conf);,就可以
 // 計(jì)算出當(dāng)前所使用的結(jié)構(gòu)體是在main_conf、srv_conf
 // 和loc_conf的哪一個(gè)數(shù)組中,而通過(guò)第二步conf = confp[cf->cycle->modules[i]->ctx_index];
 // 的計(jì)算,就可以計(jì)算出該結(jié)構(gòu)體在數(shù)組中的具體位置,并且獲取該結(jié)構(gòu)體數(shù)據(jù)。
 // 需要注意的是,這種計(jì)算方式只適用于http模塊的配置項(xiàng)獲取,因?yàn)橹挥衕ttp模塊的配置結(jié)構(gòu)體是
 // ngx_http_conf_ctx_t類型的
} else if (cf->ctx) {
 confp = *(void **) ((char *) cf->ctx + cmd->conf);

 if (confp) {
  conf = confp[cf->cycle->modules[i]->ctx_index];
 }
}

這里我們需要重點(diǎn)關(guān)注最后一個(gè) else if 分支,這里就表明了http模塊是如何根據(jù)配置項(xiàng)的定義來(lái)計(jì)算該配置項(xiàng)所對(duì)應(yīng)的結(jié)構(gòu)體的存儲(chǔ)位置的。下面的圖就展示了包含有http塊配置的整體結(jié)構(gòu):

如何在nginx中使用http模塊

2. server塊的存儲(chǔ)方式

上面我們講到,使用 ngx_http_conf_ctx_t 結(jié)構(gòu)體就可以存儲(chǔ)所有的http塊中的配置項(xiàng),那么server塊中的配置項(xiàng)是如何存儲(chǔ)的呢?其主要存儲(chǔ)在 ngx_http_core_module 模塊的 main_conf 中,也即上面的 main_conf[0] 所對(duì)應(yīng)的 ngx_http_core_main_conf_t 結(jié)構(gòu)體中,該結(jié)構(gòu)體有一個(gè)屬性 servers ,這個(gè)屬性的類型為 ngx_array_t ,也即一個(gè)數(shù)組。也就是說(shuō),在每個(gè)http配置塊下,每個(gè)server配置塊都對(duì)應(yīng)于 servers 數(shù)組的一個(gè)元素,而數(shù)組的元素類型與http塊的一致,還是 ngx_http_conf_ctx_t 。不過(guò)區(qū)別在于,由于當(dāng)前的配置項(xiàng)一定是可用于server塊或者location塊中的,而不是僅僅只能用于http塊中的,因而配置項(xiàng)的類型一定是上面講到的 NGX_HTTP_SRV_CONF_OFFSETNGX_HTTP_LOC_CONF_OFFSET 之一,而不可能是 NGX_HTTP_MAIN_CONF_OFFSET 。因而這里雖然每個(gè)server配置塊對(duì)應(yīng)的配置結(jié)構(gòu)體還是 ngx_http_conf_ctx_t ,但是其 main_conf 數(shù)組是不會(huì)有對(duì)應(yīng)的配置項(xiàng)的,而只能從http塊中繼承配置項(xiàng)。既然是繼承,nginx的處理方式是直接將該數(shù)組的指針指向http塊對(duì)應(yīng)的 ngx_http_conf_ctx_tmain_conf 數(shù)組。如下所示為兩個(gè)server塊配置的示意圖:

如何在nginx中使用http模塊

這個(gè)圖稍微看起來(lái)有點(diǎn)復(fù)雜,但實(shí)際上并不復(fù)雜,按照配置塊劃分,上面的 ngx_http_conf_ctx_t 中存儲(chǔ)的就是http塊的配置,而下面的兩個(gè) ngx_http_conf_ctx_t 存儲(chǔ)的就是兩個(gè)server塊中的配置,中間的引用過(guò)程是通過(guò)http塊的 ngx_http_core_module 模塊對(duì)應(yīng)的 ngx_http_core_main_conf_t.servers 進(jìn)行的。需要注意的一點(diǎn)是,上面的server塊的配置中, main_conf 指針都是指向的http塊的對(duì)應(yīng) ngx_http_conf_ctx_tmain_conf 屬性。

3. location塊的存儲(chǔ)方式

對(duì)于location塊的存儲(chǔ),其存儲(chǔ)結(jié)構(gòu)也還是 ngx_http_conf_ctx_t ,并且由于當(dāng)前配置項(xiàng)在location塊中的,因而其類型一定不會(huì)是 NGX_HTTP_MAIN_CONF_OFFSETNGX_HTTP_SRV_CONF_OFFSET ,也就是說(shuō),解析location配置項(xiàng)得到的數(shù)據(jù)一定是存儲(chǔ)在 loc_conf 數(shù)組中的。因而,與server塊一樣,location塊對(duì)應(yīng)的 ngx_http_conf_ctx_t 結(jié)構(gòu)體中的 main_confsrv_conf 指向的則是當(dāng)前l(fā)ocation所在的http塊的 main_conf 和所在的server塊的 srv_conf 數(shù)組。

另外,一個(gè)server塊下會(huì)有多個(gè)location塊,在存儲(chǔ)結(jié)構(gòu)上,這些location塊是以隊(duì)列的方式進(jìn)行組織的,與server塊類似,這個(gè)隊(duì)列則是存儲(chǔ)在其所在的server塊對(duì)應(yīng)的 ngx_http_conf_ctx_tloc_conf[0] 中的。這里的 loc_conf[0] 的結(jié)構(gòu)體類型為 ngx_http_core_loc_conf_s ,其有一個(gè) ngx_queue_t 類型的屬性 locations 就是該location隊(duì)列。最后需要注意的是,這里的 locations 屬性表征的不僅僅只是server塊下的多個(gè)location塊,因?yàn)樵趌ocation配置塊下還可以繼續(xù)配置多個(gè)location塊,如此不斷遞歸下去。這些子location塊的類型其實(shí)還是 ngx_http_core_loc_conf_s ,因而也是可以通過(guò) locations 屬性進(jìn)行表征的。如下是加入location配置塊的結(jié)構(gòu)體示意圖:

如何在nginx中使用http模塊

圖中展示了兩個(gè)location并列組織的情形,其 main_confsrv_conf 分別指向了http塊的 main_conf 和當(dāng)前l(fā)ocation塊所在的server塊的 srv_conf ,并且兩個(gè)location塊對(duì)應(yīng)的結(jié)構(gòu)體是以隊(duì)列的方式組織在 ngx_http_core_loc_conf_t 中的。

看完上述內(nèi)容,你們對(duì)如何在nginx中使用http模塊有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)頁(yè)標(biāo)題:如何在nginx中使用http模塊-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://weahome.cn/article/dejhii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部