Nginx原始碼分析與實踐---ngx_command_t
阿新 • • 發佈:2019-01-10
從上一節瞭解到配置項的相關屬性是由ngx_command_t這個結構體設定的,下面就來看其原始碼,分析一下。
.../src/core/ngx_core.h :
typedef struct ngx_command_s ngx_command_t;
由上可知,以s結尾的和以t結尾的是同一種類型。該標頭檔案下還有許多類似的定義。如:
.../src/core/ ngx_conf_file.h :typedef struct ngx_module_s ngx_module_t; typedef struct ngx_conf_s ngx_conf_t; typedef struct ngx_cycle_s ngx_cycle_t; typedef struct ngx_pool_s ngx_pool_t; typedef struct ngx_chain_s ngx_chain_t; typedef struct ngx_log_s ngx_log_t; typedef struct ngx_open_file_s ngx_open_file_t; typedef struct ngx_command_s ngx_command_t; typedef struct ngx_file_s ngx_file_t; typedef struct ngx_event_s ngx_event_t; typedef struct ngx_event_aio_s ngx_event_aio_t; typedef struct ngx_connection_s ngx_connection_t;
1. 第一個成員:配置指令的名稱。struct ngx_command_s { ngx_str_t name; /* 配置指令的名稱 */ ngx_uint_t type; /* 配置指令的屬性 */ char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); /* 處理讀取的資料 */ ngx_uint_t conf; /* 使用哪塊記憶體池 */ ngx_uint_t offset; /* 配置項的精確存放位置 */ void *post; /* 一般為0 */ };
比如:
#自己定義的配置項
location /test {
mytest;
}
則name就是mytest。該成員是ngx_str_t型別,即字串型別。可以很方便的用ngx_string("mytest")函式就可以給name成員賦值。
2.第二個成員:配置指令可以出現的位置及後面跟的引數的個數
nginx提供了很多預定義的屬性值(一些巨集定義),通過邏輯或運算子可組合在一起,形成對這個配置指令的詳細的說明。下面列出可在這裡使用的預定義屬性值及說明。
對於我們編寫的大多數模組而言,都是在處理http相關的事情,也就是所謂的都是NGX_HTTP_MODULE,對於這樣型別的模組,其配置可能出現的位置也是分為直接出現在http裡面,以及其他位置。//無引數 #define NGX_CONF_NOARGS 0x00000001 //1個引數,以下類推 #define NGX_CONF_TAKE1 0x00000002 #define NGX_CONF_TAKE2 0x00000004 #define NGX_CONF_TAKE3 0x00000008 #define NGX_CONF_TAKE4 0x00000010 #define NGX_CONF_TAKE5 0x00000020 #define NGX_CONF_TAKE6 0x00000040 #define NGX_CONF_TAKE7 0x00000080 //引數個數最大為8個,不能超過8個 #define NGX_CONF_MAX_ARGS 8 //1個或2個,以下類推 #define NGX_CONF_TAKE12 (NGX_CONF_TAKE1|NGX_CONF_TAKE2) #define NGX_CONF_TAKE13 (NGX_CONF_TAKE1|NGX_CONF_TAKE3) #define NGX_CONF_TAKE23 (NGX_CONF_TAKE2|NGX_CONF_TAKE3) #define NGX_CONF_TAKE123 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3) #define NGX_CONF_TAKE1234 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3 \ |NGX_CONF_TAKE4) #define NGX_CONF_ARGS_NUMBER 0x000000ff //引數可以是又個配置塊 #define NGX_CONF_BLOCK 0x00000100 //可以接收on 或 off,最終轉成bool值 #define NGX_CONF_FLAG 0x00000200 //接收任意引數 #define NGX_CONF_ANY 0x00000400 //至少1個 #define NGX_CONF_1MORE 0x00000800 #define NGX_CONF_2MORE 0x00001000 //多個,不定 #define NGX_CONF_MULTI 0x00000000 /* compatibility */ //可以出現在最外層 #define NGX_DIRECT_CONF 0x00010000 //出現在main、http、events等 #define NGX_MAIN_CONF 0x01000000 //出現在任意級別 #define NGX_ANY_CONF 0x1F000000
-
NGX_HTTP_MAIN_CONF: 可以直接出現在http配置指令裡。
-
NGX_HTTP_SRV_CONF: 可以出現在http裡面的server配置指令裡。
-
NGX_HTTP_LOC_CONF: 可以出現在http server塊裡面的location配置指令裡。
-
NGX_HTTP_UPS_CONF: 可以出現在http裡面的upstream配置指令裡。
-
NGX_HTTP_SIF_CONF: 可以出現在http裡面的server配置指令裡的if語句所在的block中。
-
NGX_HTTP_LMT_CONF: 可以出現在http裡面的limit_except指令的block中。
-
NGX_HTTP_LIF_CONF: 可以出現在http server塊裡面的location配置指令裡的if語句所在的block中。