nginx模块定制开发中介入http模块的方法及NGX_HTTP_CONTENT_PHASE阶段的详细介绍
ginx模塊定制開發中,大多數都是針對http的模塊的定制開發,比如添加一個打印“hello world”的功能、記錄http請求內容、對http請求作出一個特殊響應等,此時,需要在nginx源碼中的http模塊中介入我們的定制代碼,我們可以通過必定會被調用的postconfiguration方法,向全局的ngx_http_core_main_conf_t結構的phases[NGX_HTTP_LOG_PHASE+ 1] 添加handler
nginx的HTTP請求分為11個階段,具體可參考NGINX中HTTP請求的11個處理階段
此處我們選擇在倒數第二個階段NGX_HTTP_CONTENT_PHASE中介入
[cpp]?view plaincopy
NGX_HTTP_CONTENT_PHASE階段
這是一個核心HTTP階段,大部分HTTP模塊都會在此階段重新定義Nginx服務器的行為,主要原因如下:
1、ngx_http_phases中的前9個階段主要專注4件基礎工作,rewrite重寫URL、找到location配置塊、判斷請求是否具備訪問權限、try_files功能優先讀取靜態資源文件,這4個工作通常適用于絕大部分請求,因此,許多HTTP模塊可以共享這9個階段中以及完成的功能。
2、NGX_HTTP_CONTENT_PHASE階段與其他階段都不同的是,它向HTTP模塊提供了兩種介入該階段的方式:第一種與其他10個階段一樣,通過向全局ngx_http_core_main_conf_t結構體的phases數組中添加ngx_http_handler_pt處理方法來實現,而第二種是此階段獨有的,把希望處理請求的ngx_http_handler_pt方法設置到location相關的ngx_http_core_loc_conf_t結構體的handler指針中。
上面說的第一種方式,是通過在必定會被調用的postconfiguration方法向全局的ngx_http_core_main_conf_t結構體的phases[NGX_HTTP_LOG_PHASE+ 1]動態數組添加ngx_http_handler_pt處理方法來達成,此處理方法應用于全部的HTTP請求。
第二種方式通過設置ngx_core_loc_conf_t結構體的handler指針來實現,每一個location都對應一個獨立的ngx_core_loc_conf_t結構體,可以選擇在ngx_command_t的某個配置項的回調函數中添加處理方法,將當前location塊所屬的ngx_http_core_loc_conf_t結構體中的handler設置為ngx_http_handler_pt處理方法。這樣做的好處是,ngx_http_handler_pt處理方法不再應用于所有的HTTP請求,僅僅當用戶請求的URI匹配了location時才會被調用。
總結
以上是生活随笔為你收集整理的nginx模块定制开发中介入http模块的方法及NGX_HTTP_CONTENT_PHASE阶段的详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP-FLV的两种方式
- 下一篇: ngx_http_discard_req