1. 程式人生 > >Nginx原始碼分析與實踐---ngx_command_t

Nginx原始碼分析與實踐---ngx_command_t

上一節瞭解到配置項的相關屬性是由ngx_command_t這個結構體設定的,下面就來看其原始碼,分析一下。

.../src/core/ngx_core.h :

typedef struct ngx_command_s     ngx_command_t;
由上可知,以s結尾的和以t結尾的是同一種類型。該標頭檔案下還有許多類似的定義。如:

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;
.../src/core/ ngx_conf_file.h :
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  */
};
1. 第一個成員:配置指令的名稱。

比如:

 #自己定義的配置項
        location /test {
                mytest;
        }
則name就是mytest。該成員是ngx_str_t型別,即字串型別。可以很方便的用ngx_string("mytest")函式就可以給name成員賦值。

2.第二個成員:配置指令可以出現的位置及後面跟的引數的個數
nginx提供了很多預定義的屬性值(一些巨集定義),通過邏輯或運算子可組合在一起,形成對這個配置指令的詳細的說明。下面列出可在這裡使用的預定義屬性值及說明。

//無引數
#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
對於我們編寫的大多數模組而言,都是在處理http相關的事情,也就是所謂的都是NGX_HTTP_MODULE,對於這樣型別的模組,其配置可能出現的位置也是分為直接出現在http裡面,以及其他位置。

  • 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中。

3.第三個成員: