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...