日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx模块定制开发中介入http模块的方法及NGX_HTTP_CONTENT_PHASE阶段的详细介绍

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • static?ngx_http_module_t?ngx_http_test_module_ctx?=?{??
  • ????NULL,???????????????????????????/*?preconfiguration?*/??
  • ????ngx_http_test_init,????????????/*?postconfiguration?*/??
  • ????NULL,???????????????????????????/*?create?main?configuration.?*/??
  • ????NULL,???????????????????????????/*?init?main?configuration.?*/??
  • ????NULL,???????????????????????????/*?create?server?configuration.?*/??
  • ????NULL,???????????????????????????/*?merge?server?configuration.?*/??
  • ????ngx_http_test_create_loc_conf,?/*?create?location?configuration.?*/??
  • ????NULL????????????????????????????/*?merge?location?configuration.?*/??
  • };??
  • ???
  • ngx_module_t?ngx_http_test_module?=?{??
  • ????NGX_MODULE_V1,???
  • ????&ngx_http_test_module_ctx,?/*module?context*/??
  • ????ngx_http_test_commands,????/*module?directives*/??
  • ????NGX_HTTP_MODULE,????????????/*module?type*/??
  • ????NULL,???????????????????????/*init?master*/??
  • ????NULL,???????????????????????/*init?module*/??
  • ????NULL,???????????????????????/*init?process*/??
  • ????NULL,???????????????????????/*init?thread*/??
  • ????NULL,???????????????????????/*exit?thread*/??
  • ????NULL,???????????????????????/*exit?process*/??
  • ????NULL,???????????????????????/*exit?master*/??
  • ????NGX_MODULE_V1_PADDING??
  • };??
  • ??
  • static?ngx_int_t?ngx_http_test_init(ngx_conf_t?*cf)??
  • {??
  • ????ngx_http_handler_pt????????*w;??
  • ????ngx_http_handler_pt????????*h;??
  • ????ngx_http_core_main_conf_t??*cmcf;??
  • ??
  • ????cmcf?=?(ngx_http_core_main_conf_t*)ngx_http_conf_get_module_main_conf(cf,?ngx_http_core_module);??
  • ????//在NGX_HTTP_CONTENT_PHASE中介入處理代碼,回調函數ngx_http_test_handler可對http請求做處理??
  • ????w?=?(ngx_http_handler_pt*)ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);??
  • ????if?(w?==?NULL)???
  • ????{??
  • ????????return?NGX_ERROR;??
  • ????}??
  • ????//具體實現的回調函數??
  • ????*w?=?ngx_http_test_handler;??
  • ??
  • ????//NGX_HTTP_LOG_PHASE中介入的回調函數用來記錄日志??
  • ????h?=?(ngx_http_handler_pt*)ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);??
  • ????if?(h?==?NULL)??
  • ????{??
  • ????????return?NGX_ERROR;??
  • ????}??
  • ????//具體實現的回調函數??
  • ????*h?=?ngx_http_test_logger;??
  • ??
  • ????return?NGX_OK;??
  • }??


  • 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阶段的详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。