### 模塊配置指令[](http://tengine.taobao.org/book/chapter_03.html#id3 "永久鏈接至標題")
一個模塊的配置指令是定義在一個靜態數組中的。同樣地,我們來看一下從hello module中截取的模塊配置指令的定義。
[](http:// "點擊提交Issue,反饋你的意見...")
static ngx_command_t ngx_http_hello_commands[] = {
{
ngx_string("hello_string"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,
ngx_http_hello_string,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_hello_loc_conf_t, hello_string),
NULL },
{
ngx_string("hello_counter"),
NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
ngx_http_hello_counter,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_hello_loc_conf_t, hello_counter),
NULL },
ngx_null_command
};
其實看這個定義,就基本能看出來一些信息。例如,我們是定義了兩個配置指令,一個是叫hello_string,可以接受一個參數,或者是沒有參數。另外一個命令是hello_counter,接受一個NGX_CONF_FLAG類型的參數。除此之外,似乎看起來有點迷惑。沒有關系,我們來詳細看一下ngx_command_t,一旦我們了解這個結構的詳細信息,那么我相信上述這個定義所表達的所有信息就不言自明了。
ngx_command_t的定義,位于src/core/ngx_conf_file.h中。
[](http:// "點擊提交Issue,反饋你的意見...")
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;
};
| name: | 配置指令的名稱。 |
|-----|-----|
| type: | 該配置的類型,其實更準確一點說,是該配置指令屬性的集合。nginx提供了很多預定義的屬性值(一些宏定義),通過邏輯或運算符可組合在一起,形成對這個配置指令的詳細的說明。下面列出可在這里使用的預定義屬性值及說明。 |
-
NGX_CONF_NOARGS:配置指令不接受任何參數。
-
NGX_CONF_TAKE1:配置指令接受1個參數。
-
NGX_CONF_TAKE2:配置指令接受2個參數。
-
NGX_CONF_TAKE3:配置指令接受3個參數。
-
NGX_CONF_TAKE4:配置指令接受4個參數。
-
NGX_CONF_TAKE5:配置指令接受5個參數。
-
NGX_CONF_TAKE6:配置指令接受6個參數。
-
NGX_CONF_TAKE7:配置指令接受7個參數。
可以組合多個屬性,比如一個指令即可以不填參數,也可以接受1個或者2個參數。那么就是NGX_CONF_NOARGS|NGX_CONF_TAKE1|NGX_CONF_TAKE2。如果寫上面三個屬性在一起,你覺得麻煩,那么沒有關系,nginx提供了一些定義,使用起來更簡潔。
-
NGX_CONF_TAKE12:配置指令接受1個或者2個參數。
-
NGX_CONF_TAKE13:配置指令接受1個或者3個參數。
-
NGX_CONF_TAKE23:配置指令接受2個或者3個參數。
-
NGX_CONF_TAKE123:配置指令接受1個或者2個或者3參數。
-
NGX_CONF_TAKE1234:配置指令接受1個或者2個或者3個或者4個參數。
-
NGX_CONF_1MORE:配置指令接受至少一個參數。
-
NGX_CONF_2MORE:配置指令接受至少兩個參數。
-
NGX_CONF_MULTI: 配置指令可以接受多個參數,即個數不定。
-
NGX_CONF_BLOCK:配置指令可以接受的值是一個配置信息塊。也就是一對大括號括起來的內容。里面可以再包括很多的配置指令。比如常見的server指令就是這個屬性的。
-
NGX_CONF_FLAG:配置指令可以接受的值是”on”或者”off”,最終會被轉成bool值。
-
NGX_CONF_ANY:配置指令可以接受的任意的參數值。一個或者多個,或者”on”或者”off”,或者是配置塊。
最后要說明的是,無論如何,nginx的配置指令的參數個數不可以超過NGX_CONF_MAX_ARGS個。目前這個值被定義為8,也就是不能超過8個參數值。
下面介紹一組說明配置指令可以出現的位置的屬性。
-
NGX_DIRECT_CONF:可以出現在配置文件中最外層。例如已經提供的配置指令daemon,master_process等。
-
NGX_MAIN_CONF: http、mail、events、error_log等。
-
NGX_ANY_CONF: 該配置指令可以出現在任意配置級別上。
對于我們編寫的大多數模塊而言,都是在處理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中。
| set: | 這是一個函數指針,當nginx在解析配置的時候,如果遇到這個配置指令,將會把讀取到的值傳遞給這個函數進行分解處理。因為具體每個配置指令的值如何處理,只有定義這個配置指令的人是最清楚的。來看一下這個函數指針要求的函數原型。 |
|-----|-----|
[](http:// "點擊提交Issue,反饋你的意見...")
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
先看該函數的返回值,處理成功時,返回NGX_OK,否則返回NGX_CONF_ERROR或者是一個自定義的錯誤信息的字符串。
再看一下這個函數被調用的時候,傳入的三個參數。
- cf: 該參數里面保存從配置文件讀取到的原始字符串以及相關的一些信息。特別注意的是這個參數的args字段是一個ngx_str_t類型的數組,該數組的首個元素是這個配置指令本身,第二個元素是指令的第一個參數,第三個元素是第二個參數,依次類推。
- cmd: 這個配置指令對應的ngx_command_t結構。
- conf: 就是定義的存儲這個配置值的結構體,比如在上面展示的那個ngx_http_hello_loc_conf_t。當解析這個hello_string變量的時候,傳入的conf就指向一個ngx_http_hello_loc_conf_t類型的變量。用戶在處理的時候可以使用類型轉換,轉換成自己知道的類型,再進行字段的賦值。
為了更加方便的實現對配置指令參數的讀取,nginx已經默認提供了對一些標準類型的參數進行讀取的函數,可以直接賦值給set字段使用。下面來看一下這些已經實現的set類型函數。
- ngx_conf_set_flag_slot: 讀取NGX_CONF_FLAG類型的參數。
- ngx_conf_set_str_slot:讀取字符串類型的參數。
- ngx_conf_set_str_array_slot: 讀取字符串數組類型的參數。
- ngx_conf_set_keyval_slot: 讀取鍵值對類型的參數。
- ngx_conf_set_num_slot: 讀取整數類型(有符號整數ngx_int_t)的參數。
- ngx_conf_set_size_slot:讀取size_t類型的參數,也就是無符號數。
- ngx_conf_set_off_slot: 讀取off_t類型的參數。
- ngx_conf_set_msec_slot: 讀取毫秒值類型的參數。
- ngx_conf_set_sec_slot: 讀取秒值類型的參數。
- ngx_conf_set_bufs_slot: 讀取的參數值是2個,一個是buf的個數,一個是buf的大小。例如: output_buffers 1 128k;
- ngx_conf_set_enum_slot: 讀取枚舉類型的參數,將其轉換成整數ngx_uint_t類型。
- ngx_conf_set_bitmask_slot: 讀取參數的值,并將這些參數的值以bit位的形式存儲。例如:HttpDavModule模塊的dav_methods指令。
| conf: | 該字段被NGX_HTTP_MODULE類型模塊所用 (我們編寫的基本上都是NGX_HTTP_MOUDLE,只有一些nginx核心模塊是非NGX_HTTP_MODULE),該字段指定當前配置項存儲的內存位置。實際上是使用哪個內存池的問題。因為http模塊對所有http模塊所要保存的配置信息,劃分了main, server和location三個地方進行存儲,每個地方都有一個內存池用來分配存儲這些信息的內存。這里可能的值為 NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET或NGX_HTTP_LOC_CONF_OFFSET。當然也可以直接置為0,就是NGX_HTTP_MAIN_CONF_OFFSET。 |
|-----|-----|
| offset: | 指定該配置項值的精確存放位置,一般指定為某一個結構體變量的字段偏移。因為對于配置信息的存儲,一般我們都是定義個結構體來存儲的。那么比如我們定義了一個結構體A,該項配置的值需要存儲到該結構體的b字段。那么在這里就可以填寫為offsetof(A, b)。對于有些配置項,它的值不需要保存或者是需要保存到更為復雜的結構中時,這里可以設置為0。 |
| post: | 該字段存儲一個指針。可以指向任何一個在讀取配置過程中需要的數據,以便于進行配置讀取的處理。大多數時候,都不需要,所以簡單地設為0即可。 |
看到這里,應該就比較清楚了。ngx_http_hello_commands這個數組每5個元素為一組,用來描述一個配置項的所有情況。那么如果有多個配置項,只要按照需要再增加5個對應的元素對新的配置項進行說明。
**需要注意的是,就是在ngx_http_hello_commands這個數組定義的最后,都要加一個ngx_null_command作為結尾。**
- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試