天天看點

NGINX子產品開發 之 驗證URL參數1 修改配置2 編寫代碼3. 編譯工程

作者:鄒祁峰

郵箱:[email protected]

部落格:

日期:2014.05.26 16:45

轉載請注明來自""的CSDN部落格

    要求在浏覽器位址欄中輸入"localhost/login?user=qifeng&passwd=123456",并在浏覽器上顯示驗證結果(Success 或 Failed)。以下是在NGINX中添加一個LOGIN子產品的整個處理過程。

  修改配置檔案nginx.conf,在其中增加如下配置資訊:

圖1 修改配置

(注意:将passwd的值"abcd"改為“123456”)

    在NGINX源碼目錄src下建立ext檔案夾,src/ext用于存放所有擴充子產品代碼,src/ext/login則用于存放LOGIN子產品的代碼.

    #mkdir -p src/ext/login

    #cd src/ext/login

    #vim ngx_http_login_module.c

  LOGIN子產品主要實作的是對使用者(user)和密碼(password)的驗證,是以,配置資訊結構中需要包含user字段和password字段,故其結構定義如下:(命名規則:ngx_http_子產品名_(main|srv|loc)conf_t)

代碼1 定義配置結構

  從圖1中可知:配置項有user、passwd和check.解析這些配置項的配置項的解析是通過配置ngx_command_t數組,配置項解析數組如下:(命名規則:ngx_http_子產品名_commands)

代碼2 配置項解析數組

    定義子產品配置解析過程中各階段的處理回調:(命名規則:ngx_http_子產品名_module_ctx)

代碼3 配置解析各階段回調

  絕大多數handler隻需要設定最後面回調函數,即:設定ngx_http_xxx_create_loc_conf和ngx_http_xxx_merge_loc_conf.前者用于特定location的記憶體配置設定,而後者用來設定預設值以及合并繼承過來的配置值,同時往往還負責配置值的合法性驗證,如果不合法,則退出後續處理。

  NGINX中包含了很多子產品,所有子產品都是通過ngx_module_t類型,但每個子產品擁有不同的屬性。通過設定各子產品不同的屬性來控制各子產品的行為。LOGIN子產品的子產品屬性設定如下:

代碼4 設定子產品屬性

  在代碼3中的定義配置解析各階段的回調設定了建立loc配置時的回調ngx_http_login_create_loc_conf(),其主要功能是為location配置配置設定記憶體空間,實作代碼如下:

代碼5 建立loc配置時的回調

  在代碼1中的定義配置項解析數組中設定了配置項check的回調ngx_http_login_check(),其主要功能解析配置項check,并設定解析後的處理函數,實作代碼如下:

代碼6 CHECK配置項解析處理

  在ngx_http_login_check()中對配置項check進行了解析處理,同時設定了解析後的處理函數:ngx_http_login_check_handler(),其主要功能是檢測URL中的參數user和passwd的合法性,并傳回最終的驗證結果。實作代碼如下:

代碼7 合法性驗證

  完成以上編輯工作後,最後的工作就是将編寫的代碼加入NGINX工程。其處理步驟如下:

    #vim config

    在config檔案中輸入如下内容:

代碼8 編譯配置

  注意:以上config檔案中的等号(=)前後不能有空格,否則執行./configure --add-module=src/ext/login時,并不能将login子產品加入到工程編譯環境中.

NGINX子產品開發 之 驗證URL參數1 修改配置2 編寫代碼3. 編譯工程

圖2 變量值與等号之間有空格

  完成config的編輯後,LOGIN子產品還沒有加入到編譯工程中。NGINX的編譯腳本比較複雜,功能也十分強大,在編譯之前必須告知NGINX編譯腳本到指定的路徑去添加LOGIN子產品:

    #./configure --with-debug --add-module=src/ext/login

    #make

    #make install

  在浏覽器位址欄中輸入:localhost/login?user=qifeng&passwd=123456,将會傳回成功;輸入localhost/login?user=zhangsan&passwd=123456,将會傳回失敗。如下圖所示:

NGINX子產品開發 之 驗證URL參數1 修改配置2 編寫代碼3. 編譯工程

圖3 驗證成功

NGINX子產品開發 之 驗證URL參數1 修改配置2 編寫代碼3. 編譯工程

圖4 驗證失敗