Nginx Http框架的理解

2022-09-16 01:57:11 字數 3359 閱讀 3247

nginx http框架的理解

http框架是nginx基礎框架的一部分,nginx的其它底層框架如master-worker程序模型、event模組、mail 模組等。

http框架**主要有2個模組組成:ngx_http_module和ngx_http_core_module;

我們編寫的http模組需要註冊到http框架上,才能融入http請求的處理流程中。

當在nginx.conf中存在乙個http的配置時,即啟用了http框架**,在nginx配置解析時,就已經為框架建立好了各種資料結構(尤其是http模組的掛載);

當nginx收到請求時,請求完全按照http框架建立好的這種邏輯進行處理。

一、http模組開發基礎

開發乙個http模組,需要下面幾個資料結構:

1. http模組配置結構

用於儲存從配置檔案讀進來的相關指令引數;

配置模組的context有三種,分別是main、server和location,它們分別位於於http、server和location上下文中。

其名稱約定如下:ngx_http__(main|srv|loc)_conf_t

2.http 模組配置指令

模組的指令是定義在乙個叫做ngx_command_t的靜態陣列中的;

ngx_command_t陣列以ngx_null_command為終結符。

struct ngx_command_t ;

其中,type成員表明這個指令允許出現的context、引數個數:

指令出現在main配置部分是合法的

指令在server配置部分出現是合法的 config

指令在location配置部分出現是合法的

指令在upstream配置部分出現是合法的

* ngx_conf_noargs: 

指令沒有引數

* ngx_conf_take1: 

指令讀入1個引數

* ngx_conf_take7: 

指令讀入7個引數

* ngx_conf_flag: 

指令讀入1個布林型資料 ("on" or "off")

* ngx_conf_1more:

指令至少讀入1個引數

* ngx_conf_2more:

指令至少讀入2個引數

set成員是乙個函式指標,用於模組引數解析,可以將配置檔案中的模組引數傳遞給模組;

該函式會在遇到指令時執行,

函式有三個入參:

a. 指向結構體 ngx_conf_t 的指標, 這個結構體裡包含需要傳遞給指令的引數

b. 指向結構體 ngx_command_t 的指標

c. 指向模組自定義配置結構體的指標 

nginx內部提供了多個函式用來儲存特定型別的資料,這些函式包括:

* ngx_conf_set_flag_slot: 

將 "on" or "off" 轉換成 1 or 0

* ngx_conf_set_str_slot: 

將字串儲存為 ngx_str_t

* ngx_conf_set_num_slot:

解析乙個數字並儲存為int

* ngx_conf_set_size_slot: 

解析乙個資料大小(如:"8k", "1m") 並儲存為size_t

conf成員告訴nginx把資料存在模組的哪個context中

offset成員確定儲存在結構體的哪個位置;

post成員指向模組在讀配置的時候需要的一些零碎變數,一般為null。

3. http模組上下文結構

靜態的ngx_http_module_t結構體,用來建立和合併三段context (main,server,location),

其命名方式一般是:ngx_http__module_ctx,

這些**是在ngx_http_block()解析http配置時完成的:

當遇到乙個 http 時,http框架會呼叫所有http模組可能實現的create_main_conf、create_srv_conf、create_loc_conf生成儲存main級別配置引數結構體;

當遇到乙個server時,http框架會呼叫所有http模組可能實現的create_srv_conf、create_loc_conf生成儲存server級別配置引數結構體;

當遇到乙個location時,http框架會呼叫所有http模組可能實現的create_loc_conf生成儲存location級別配置引數結構體;

因此,我們開發的http模組中create_loc_conf方法被呼叫的次數等於http、server、location在nginx.conf出現的次數之和;

create_srv_conf方法被呼叫的次數等於server、location在nginx.conf出現的次數之和;

由於只有乙個http,所以create_main_conf方法只會被呼叫一次;

http建立了如此多的結構體來存放配置項,是為了解決同名配置項的合併問題。

4、http模組定義

乙個nginx模組被定義為乙個ngx_module_t結構,

該結構體變數命名方式為ngx_http__module

它包含模組的內容和指令執行方式,同時還包含一些**函式來處理執行緒/程序的建立和銷毀;

模組定義在有的時候會被用作查詢的關鍵字,來查詢與特定模組相關聯的資料。

struct ngx_module_s ;

注意:在configure之後生成的檔案 objs/ngx_modules.c 中包含了模組的編譯順序。

1、解析http配置的流程

首先要理解 ngx_conf_parse() 的遞迴解析流程;

nginx在解析nginx.conf的時候,沒讀取一行配置項,就執行該配置項的解析**(handler);

nginx HTTP框架提供的變數

1.arg 引數名 url中某個具體引數的值 2.query string 預args變數完全相同 3.args 全部url引數 4.is args 如果請求url中有引數則返回?否則返回空 5.content length http請求中標識包體長度的content length頭部的值 6.co...

Nginx HTTP框架是如何介入請求

參考資料 深入理解nginx 陶輝 nginx是乙個事件驅動構架的web伺服器,在上次的部落格中我們可以看到nginx是如何驅動事件的處理的。本次將介紹http框架是如何介入跟處理http網路事件的。因為書上的思路已經足夠清晰而且內容比較獨立,因此本次基本上就把本章的重點記錄一下。http框架存在的...

nginx http配置的解析

對nginx配置解析這塊,一直都是模模糊糊,沒有條理,現在梳理一下 1 乙個意思就是nginx core module本身,它和nginx http module nginx event module還有ngx mail module是並列的,他們是最上層的一些模組,你看他們的定義會發現,他們都是n...